You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

拓展说明

如果后续页面需要调用主应用的公共方法、或者跨页面共享数据,可以在初始化页面类时传入主应用实例:

  1. 页面类的__init__增加master_app参数存储主应用实例
  2. 初始化时写为PageOne(self.right_frame, self, bg="yellow"),即可在页面内部调用主应用的所有属性和方法

内容的提问来源于stack exchange,提问作者kalahari carl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 15:42:02