一尘不染

Python-为什么不建议使用多个Tk实例?

python

考虑以下示例:

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?
第二个代码段是否被认为更好一些,还是遇到了与第一个代码相同的条件?


阅读 674

收藏
2020-02-11

共1个答案

一尘不染

为什么拥有多个实例被认为是不好的Tk?

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

每个Tcl解释器都是一个隔离的沙箱。一个沙箱中的对象无法与另一个沙箱中的对象进行交互。最常见的表现是StringVar在一个解释器中创建的在另一个解释器中不可见。窗口小部件也是如此-您不能在一个解释器中创建窗口小部件,而在另一个解释器中将其作为父窗口小部件。

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

第二个代码段是否被认为更好一些,还是遇到了与第一个代码相同的条件?

在不知道您要达到的目标的情况下,不可能说出问题中的第二个例子是否更好。可能再好不过了,因为您再一次很少实际需要两个实例。

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

2020-02-11