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

问题描述 投票:4回答:2

考虑下面的例子:

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实例被认为是坏事?
  • 第二个片段是否被认为更好一点,或者第一个代码的条件是否相同?
python tkinter tcl tk
2个回答
10
投票

为什么有多个Tk实例被认为是坏事?

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

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

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

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

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

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


2
投票

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

在我们使用过的简单示例中,屏幕上只有一个窗口;根窗口。调用Tk构造函数时会自动创建

如果需要创建其他窗口,可以使用Toplevel小部件。它只是在屏幕上创建一个新窗口,这个窗口的外观和行为与原始根窗口非常相似

我对它的看法是,Tk实例创建了一个Toplevel小部件,加上像mainloop这样的东西,其中只有一个。

© www.soinside.com 2019 - 2024. All rights reserved.