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
相关产品推荐
相关产品推荐

