Tkinter GUI如何将不同Frame拆分到独立文件并调用
Tkinter页面拆分实现方案
步骤1:创建3个独立的页面类文件
每个页面单独存为一个py文件,所有页面内部的控件、业务逻辑都封装在对应文件的Frame子类中,和主入口逻辑完全解耦。
page1.py 代码
import tkinter as tk class PageOne(tk.Frame): def __init__(self, parent, *args, **kwargs): # parent为页面挂载的父容器(也就是主应用的中间工作区) super().__init__(parent, *args, **kwargs) # 以下是页面1的所有控件逻辑,后续新增内容都写在这里 self.label = tk.Label(self, text="This is page one") self.label.pack()
page2.py 代码
import tkinter as tk class PageTwo(tk.Frame): def __init__(self, parent, *args, **kwargs): super().__init__(parent, *args, **kwargs) # 页面2的所有控件逻辑写在这里 self.label = tk.Label(self, text="This is page two") self.label.pack()
page3.py 代码
import tkinter as tk class PageThree(tk.Frame): def __init__(self, parent, *args, **kwargs): super().__init__(parent, *args, **kwargs) # 页面3的所有控件逻辑写在这里 self.label = tk.Label(self, text="This is page three") self.label.pack()
步骤2:修改main.py代码
删除原有pageOne、pageTwo、pageThree方法里的页面逻辑,改为调用独立页面类,同时优化旧页面销毁的逻辑(原有逻辑存在or短路导致第二个页面不会销毁的问题)。
修改后的完整main.py代码:
import tkinter as tk # 导入三个独立页面类 from page1 import PageOne from page2 import PageTwo from page3 import PageThree class App: def __init__(self, root): self.root = root self.top() self.left() self.middle() self.pageOne() def top(self): self.top_panel = tk.Frame(self.root) self.top_panel.pack() self.logo = tk.Label(self.top_panel, text="LOGO GOES HERE", fg="Blue", width=40) self.logo.pack(fill=tk.BOTH, expand=1) def left(self): self.left_frame = tk.Frame(self.root) self.left_frame.pack(side="left", fill=tk.BOTH, expand=0) # 按钮绑定的方法名不需要修改,兼容原有逻辑 self.page_one = tk.Button(self.left_frame, text="Page 1", command=self.pageOne) self.page_one.pack(fill=tk.BOTH) self.page_two = tk.Button(self.left_frame, text="Page 2", command=self.pageTwo) self.page_two.pack(fill=tk.BOTH) self.page_three = tk.Button(self.left_frame, text="Page 3", command=self.pageThree) self.page_three.pack(fill=tk.BOTH) # 中间工作区初始化 def middle(self): self.right_frame = tk.Frame(self.root, bg="red", width=60) self.right_frame.pack(side="left", fill=tk.BOTH, expand=1) # 切换到页面1 def pageOne(self): # 销毁其他已存在的页面 for page_attr in ["page_two_frame", "page_three_frame"]: if hasattr(self, page_attr): getattr(self, page_attr).destroy() # 初始化页面1并渲染 self.page_one_frame = PageOne(self.right_frame, bg="yellow") self.page_one_frame.pack(fill=tk.BOTH, expand=1) # 切换到页面2 def pageTwo(self): for page_attr in ["page_one_frame", "page_three_frame"]: if hasattr(self, page_attr): getattr(self, page_attr).destroy() self.page_two_frame = PageTwo(self.right_frame, bg="blue") self.page_two_frame.pack(fill=tk.BOTH, expand=1) # 切换到页面3 def pageThree(self): for page_attr in ["page_one_frame", "page_two_frame"]: if hasattr(self, page_attr): getattr(self, page_attr).destroy() self.page_three_frame = PageThree(self.right_frame, bg="green") self.page_three_frame.pack(fill=tk.BOTH, expand=1) if __name__ == "__main__": root = tk.Tk() app = App(root) root.mainloop()
拓展说明
如果后续页面需要调用主应用的公共方法、或者跨页面共享数据,可以在初始化页面类时传入主应用实例:
- 页面类的
__init__增加master_app参数存储主应用实例 - 初始化时写为
PageOne(self.right_frame, self, bg="yellow"),即可在页面内部调用主应用的所有属性和方法
内容的提问来源于stack exchange,提问作者kalahari carl
相关产品推荐
相关产品推荐

