考虑以下示例:
import tkinter as tk root = tk.Tk() root.title("root") other_window = tk.Tk() other_window.title("other_window") root.mainloop()
并且还请参见下面的示例,该示例创建了Tk背对背的实例,而不是一次创建,因此在任何给定时间都只有一个实例Tk:
import tkinter as tk def create_window(window_to_be_closed=None): if window_to_be_closed: window_to_be_closed.destroy() window = tk.Tk() tk.Button(window, text="Quit", command=lambda arg=window : create_window(arg)).pack() window.mainloop() create_window()
为什么拥有多个实例被认为是不好的Tk? 第二个代码段是否被认为更好一些,还是遇到了与第一个代码相同的条件?
为什么拥有多个实例被认为是不好的Tk?
Tkinter只是围绕导入Tk库的嵌入式Tcl解释器的python包装器。创建根窗口时,将创建Tcl解释器的实例。
每个Tcl解释器都是一个隔离的沙箱。一个沙箱中的对象无法与另一个沙箱中的对象进行交互。最常见的表现是StringVar在一个解释器中创建的在另一个解释器中不可见。窗口小部件也是如此-您不能在一个解释器中创建窗口小部件,而在另一个解释器中将其作为父窗口小部件。
StringVar
从技术角度来看,没有理由不能同时拥有两个实例Tk。对此的建议是因为实际上很少需要两个或多个不同的Tcl解释器,并且它会引起初学者难以理解的问题。
第二个代码段是否被认为更好一些,还是遇到了与第一个代码相同的条件?
在不知道您要达到的目标的情况下,不可能说出问题中的第二个例子是否更好。可能再好不过了,因为您再一次很少实际需要两个实例。
最好的解决方案是99.9%的时间是为Tk程序的整个生命周期创建一个实例。很简单,这就是设计使用tkinter和底层Tcl / Tk解释器的方式。