IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python3 tkinter页面跳转(尽量松耦合? -> 正文阅读

[Python知识库]python3 tkinter页面跳转(尽量松耦合?

tkinter简介:

tkinter是python3自带的GUI模块,可以很方便地生成一个exe/app,windows和macOS都适用。

业务目标:

一个有三级页面的程序,二级页面可以返回一级页面,三级页面可以返回二级页面

技术目标:

尽量松耦合,一级页面一直存在不被销毁,除非退出程序

页面结构

main page
- month page
- month page 2
- version page
- version page 2

最后的效果:

tkinter demo动图

程序结构

# 程序入口,一个自定义的application
if __name__ == '__main__':

    pm = PageManager()
    pm.mainloop()

# 自定义的application类,继承自tkinter.Tk
# 参照大多数教程root = tkinter.Tk()
class PageManager(tkinter.Tk):
    """
        这是一个application
    """
    def __init__(self):
        super().__init__()
        self.title("App test")
        self.geometry("200x100")
        self.iconbitmap()
        self.pages = []
        p = MainPage(self)  # 主要功能:初始化主页,永远都在list的第一个
        self.pages.append(p)
        print("after init, pages length: ", len(self.pages))

# 自定义的主页类,继承自tkinter.Frame
# 参照大多数教程frame = Frame(root, ....)
class MonthlyPage(Frame):
    def __init__(self, win):
        super().__init__(win)
        self.win = win
        Label(self, text="this is page month").pack()
        Button(self, text="month page TWO", command=self.go_to_month_two).pack()
        Button(self, text="go back", command=self.go_back).pack()
        print("this is month page, now the pages: ", len(self.win.pages))
        self.pack()

    def go_to_month_two(self):
        print("month page now go to month page TWO...")
        self.forget()   # 本页面没有销毁,只是隐藏,要不然会窗口中既有month page 也有month page 2
        p = MonthlyPageTwo(self.win)    # 让month page 2 出现在窗口中,主要就是pack方法
        self.win.pages.append(p)    # 更新窗口的page_list,像出栈入栈一样展示frames

    def go_back(self):
        self.win.pages.pop()
        self.win.pages[-1].pack()   # 返回到上一页
        self.destroy()  # 那当前页就可以销毁了

# 和month page 基本一样的month page 2
class MonthlyPageTwo(Frame):
    def __init__(self, win):
        super().__init__(win)
        self.win = win
        Label(self, text="this is page month TWO").pack()
        Button(self, text="go back", command=self.go_back).pack()
        print("this is month page TWO, now the pages: ", len(self.win.pages))
        self.pack()

    def go_back(self):
        self.win.pages.pop()
        self.win.pages[-1].pack()
        self.destroy()

# version page就更是copy month page了,省略

待处理的

原来PageManager.py的pages是类属性,考虑到每个frame都共用同一个PageManager类。
但实现起来发现,获取len(pages)时需要指定类名而不是实例名,然后就发生里循环import的报错。
临时解决方法:把类属性改成了实例属性。
**最终待解决:**弄清楚怎么解决循环import问题

总结

别看最后代码不多,这结构思考了好久,方案翻来覆去想不通,最后还是画图+code能解决问题!

plan A:

一个PageManager管理所有页面的show和hide,这样的话,一级页面调用二级页面是没问题,但二级页面哪里还能去调用PageManager的show和hide呢? FAIL!

plan B:

顺序实现,别管什么结构先,最后看看写出来的东西再考虑优化的方向。 PASS!

从MainPage写完2个二级页面,发现二级页面很雷同,可以提出来,只是要考虑实例化时传参的问题——Frame实例化需要传入窗口/app这个参数,而实例化控件只需传入Frame这个参数,无形中已经分好层次了,哪些对象可以写在一个类中。
即Frame和控件组合,窗口/app独立成一个参数传给Frame。

# PageManager.py
# 把自己作为参数,实例化Frame
p = MainPage(self)

# MonthPage.py
class MonthlyPage(Frame):
    def __init__(self, win):
        super().__init__(win)
        self.win = win

设置PageManager最主要的目的就是想用上page_list这个数据结构,因为觉得这些页面叠加又去掉,很像出栈入栈。
等到页面间的关系复杂了,也许能派上用场。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-11-18 11:09:13  更:2021-11-18 11:11:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 1:33:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码