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

Python Tkinter如何在一个窗口中打开两个模块?

解决Tkinter单窗口内页面切换问题

核心问题在于你当前的实现大概率创建了多个tk.Tk()实例,或是未正确管理组件显示逻辑,导致出现独立窗口。要实现同一窗口内的内容切换,推荐用Frame容器+组件显示/隐藏的方式,以下是修改后的完整代码:

修改fileA.py

import tkinter as tk
from GUI.module.scale_of_img import get_scale
# 导入SecondPage类
from fileB import SecondPage

class FirstPage:
    def __init__(self, root):
        self.root = root
        self.get_settings()
        # 创建主容器,用于承载不同页面
        self.main_frame = tk.Frame(self.root)
        self.main_frame.pack(fill="both", expand=True)
        # 渲染第一页内容
        self.render_first_page()

    def get_settings(self):
        self.root.title('主窗口')
        self.root.resizable(False, False)
        self.root.geometry("1038x900")

    def render_first_page(self):
        # 清空主容器内的所有组件(防止重复加载)
        for widget in self.main_frame.winfo_children():
            widget.destroy()
        # 添加退出按钮
        exit_btn = tk.Button(self.main_frame, text="退出", command=self.root.quit)
        exit_btn.pack(pady=20)
        # 添加启动按钮,点击后加载第二页
        start_btn = tk.Button(self.main_frame, text="启动", command=self.load_second_page)
        start_btn.pack(pady=10)

    def load_second_page(self):
        # 清空主容器,加载第二页内容
        for widget in self.main_frame.winfo_children():
            widget.destroy()
        # 将主容器作为SecondPage的父组件,实现嵌入
        SecondPage(self.main_frame)

if __name__ == '__main__':
    root = tk.Tk()
    first = FirstPage(root)
    root.mainloop()

修改fileB.py

import tkinter as tk

class SecondPage:
    def __init__(self, parent):
        self.parent = parent
        # 将Canvas放在传入的父容器中,而非独立窗口
        self.my_canvas = tk.Canvas(self.parent, width=1038, height=678, bg="lightblue")
        self.my_canvas.pack(fill="both", expand=True)
        # 可添加第二页的其他组件
        tk.Label(self.my_canvas, text="这是第二页内容").place(relx=0.5, rely=0.5, anchor="center")

if __name__ == '__main__':
    # 单独测试时再创建独立窗口
    root = tk.Tk()
    root.geometry("1038x900")
    SecondPage(root)
    root.mainloop()

关键改动说明

  • 统一窗口实例:全程仅使用一个tk.Tk()实例(在fileA的main函数中创建),所有页面组件都挂载到该实例的子容器main_frame中,避免生成新窗口。
  • 组件清理机制:切换页面时先清空主容器内的原有组件,防止内容叠加。
  • 父容器传递:SecondPage不再直接接收root,而是接收父容器Frame,实现内容嵌入而非独立窗口。
  • 按钮逻辑完善:给启动按钮绑定页面切换方法,确保点击后在同一窗口内加载第二页内容。

内容的提问来源于stack exchange,提问作者Adrian Sz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 19:55:16