为什么不鼓励多个Tk实例?

时间:2017-12-31 20:12:28

标签: python tkinter tcl tk

请考虑以下示例:

import tkinter as tk

root = tk.Tk()
root.title("root")

other_window = tk.Tk()
other_window.title("other_window")

root.mainloop()

并且还会看到以下示例,即背靠背而不是一次创建Tk的实例,因此在任何给定时间只有一个 {/ 1>}实例:

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() 的多个实例?
  • 被认为是不好的
  • 第二个片段是否被认为更好,或者是否受到影响 第一个代码的条件相同吗?

3 个答案:

答案 0 :(得分:10)

  

为什么有Tk的多个实例?

被认为是不好的

Tkinter只是一个嵌入式Tcl解释器的python包装器,可以导入Tk库。创建根窗口时,将创建Tcl解释器的实例。

每个Tcl解释器都是一个独立的沙箱。一个沙箱中的对象无法与另一个沙箱中的对象进行交互。最常见的表现是在一个解释器中创建的StringVar在另一个解释器中不可见。小部件也是如此 - 您可以在一个解释器中创建小部件,该解释器在另一个解释器中作为父小部件。

从技术角度来看,没有理由不能同时拥有两个Tk个实例。针对它的建议是因为很少有实际需要拥有两个或更多不同的Tcl解释器,并且它会导致初学者难以掌握的问题。

  

第二个代码段是否被认为更好一点,或者第一个代码的条件是否相同?

如果不知道你想要实现的目标,问题中的第二个例子是否更好是不可能的。它可能并不好,因为再次,你真的需要两个实例的时间很少。

最佳解决方案99.9%的时间是创建一个Tk的实例,用于程序的生命周期。很简单,这就是tkinter和底层Tcl / Tk解释器的设计使用方式。

答案 1 :(得分:2)

到目前为止,我发现的最佳参考是this section in the tkinterbook

  

在我们使用过的简单例子中,屏幕上只有一个窗口;根窗口。当您调用 Tk 构造函数

时会自动创建

  

如果您需要创建其他窗口,可以使用 Toplevel 小部件。它只是在屏幕上创建一个新窗口,一个看起来和行为非常类似于原始根窗口的窗口

我认为,Tk实例会创建一个Toplevel窗口小部件,以及mainloop之类的内容,其中应该只有一个。

答案 2 :(得分:1)

Tk()初始化隐藏的tcl解释器,以便代码可以运行,因为Tkinter只是tcl / tk的包装器。它还会自动创建一个新窗口。 Toplevel()只是创建一个新窗口,如果尚未实例化Tk(),则将无法工作,因为它需要Tk()初始化的tcl解释器。如果不实例化Tk(),则不能创建任何Tkinter窗口小部件,并且Toplevel仅仅是一个窗口小部件。在问题中,您使用Tk()创建第二个窗口。相反,您应该创建另一个文件,因为多次初始化tcl解释器可能会造成混淆,就像@Bryan Oakley解释得很好一样。然后,您应该这样做:

from os import startfile startfile(nameOfTheOtherFile)

,因为Toplevel()只是一个窗口小部件,因此在Tk()窗口关闭时它也会关闭。将另一个窗口放在单独的文件中可以减少混乱。