Tkinter程序启动时所有声明窗口自动打开如何解决?
解决Tkinter窗口按需启动的问题
你的代码问题出在直接实例化Tk()对象——只要执行addFenster = Tk()这类语句,Tkinter就会立即创建并显示对应的窗口,和后续的条件判断无关,所以三个窗口会一次性全部弹出。
要实现按需启动窗口,只需把每个窗口的创建逻辑封装成独立函数,需要打开哪个窗口时再调用对应的函数即可。下面提供两种可行方案:
方案1:独立窗口(每个窗口都是单独的Tk实例)
这种方案下每个窗口完全独立,关闭一个不会影响其他窗口的运行:
from tkinter import * def open_start_window(): startFenster = Tk() startFenster.geometry('300x300') startFenster.title("RFID-Tool: Einstieg") startFenster.mainloop() def open_add_window(): addFenster = Tk() addFenster.geometry('800x600') addFenster.title("RFID-Tool: Benutzer hinzufügen") addFenster.mainloop() def open_delete_window(): deleteFenster = Tk() deleteFenster.geometry('800x600') deleteFenster.title("RFID-Tool: Benutzer entfernen") deleteFenster.mainloop() # 按需调用示例 if __name__ == "__main__": # 比如默认打开启动窗口 open_start_window() # 需要打开添加窗口时,取消注释下面一行 # open_add_window() # 需要打开删除窗口时,取消注释下面一行 # open_delete_window()
方案2:主窗口+子窗口(符合Tkinter规范)
Tkinter官方推荐一个程序只保留一个主Tk()实例,其他窗口用Toplevel()作为子窗口,这样只需要一个主循环,窗口管理更便捷:
from tkinter import * def open_add_window(root): # 创建依附于主窗口的子窗口 addFenster = Toplevel(root) addFenster.geometry('800x600') addFenster.title("RFID-Tool: Benutzer hinzufügen") # 子窗口无需单独启动mainloop,依附主窗口的循环运行 def open_delete_window(root): deleteFenster = Toplevel(root) deleteFenster.geometry('800x600') deleteFenster.title("RFID-Tool: Benutzer entfernen") def open_start_window(): # 主窗口实例 root = Tk() root.geometry('300x300') root.title("RFID-Tool: Einstieg") # 在启动窗口添加按钮,触发打开其他窗口 btn_add = Button(root, text="添加用户", command=lambda: open_add_window(root)) btn_add.pack(pady=10) btn_delete = Button(root, text="删除用户", command=lambda: open_delete_window(root)) btn_delete.pack(pady=10) # 启动主循环 root.mainloop() # 启动程序 if __name__ == "__main__": open_start_window()
两种方案的选择:如果需要窗口完全独立运行,选方案1;如果希望窗口间有依附关系、更易维护,优先选方案2。
内容的提问来源于stack exchange,提问作者Looky
相关产品推荐
相关产品推荐

