2024-09-30 18:28:07 发布
网友
from tkinter import * def fun(): trywindow=Tk() s=StringVar() entry=Entry(trywindow, textvariable=s) s.set("print") entry.pack() trywindow.mainloop() root=Tk() fun() root.mainloop()
据我说,执行此代码后,第二个窗口应该显示输入块与文字写在它“打印”,但它是空白的。你知道吗
如注释中所述,不鼓励使用多个Tk()实例。它会导致人们意想不到的行为,这个问题就是一个很好的例子。你知道吗
Tk()
如this answer中所述,Tk的所有实例都是完全隔离的。“属于”其中一个的对象无法在其他对象中看到或使用。 代码中发生的事情是有两个Tk实例:root和trywindow。然后创建一个StringVar,没有任何参数。这是通常的方法,但实际上您可以在构建期间提供一个主小部件。这样,您就可以控制您的StringVar“所属的Tk实例”。请参阅effbot中的这句话:
Tk
root
trywindow
StringVar
The constructor argument is only relevant if you’re running Tkinter with multiple Tk instances (which you shouldn’t do, unless you really know what you’re doing).
如果不指定主控形状,则会隐式选择主控形状。我相信它总是Tk的第一个创建实例。在您的例子中,StringVar是用root作为其主节点创建的。因为这些Tk实例是完全分离的,trywindow和其中的所有小部件都无法“看到”其中的StringVar或任何值。你知道吗
因此,只需将trywindow传递给SringVar构造即可修复代码:
SringVar
s=StringVar(trywindow)
但是,将trywindow从Tk实例更改为Toplevel小部件可能更容易。这也会创建一个新窗口,但它属于同一个Tk实例,因此在使用单独的Tk实例时不会遇到这些困难:
Toplevel
from tkinter import * def fun(): trywindow = Toplevel() s = StringVar() entry = Entry(trywindow, textvariable=s) s.set("print") entry.pack() trywindow.mainloop() root = Tk() fun() root.mainloop()
如注释中所述,不鼓励使用多个
Tk()
实例。它会导致人们意想不到的行为,这个问题就是一个很好的例子。你知道吗如this answer中所述,
Tk
的所有实例都是完全隔离的。“属于”其中一个的对象无法在其他对象中看到或使用。代码中发生的事情是有两个
Tk
实例:root
和trywindow
。然后创建一个StringVar
,没有任何参数。这是通常的方法,但实际上您可以在构建期间提供一个主小部件。这样,您就可以控制您的StringVar
“所属的Tk
实例”。请参阅effbot中的这句话:如果不指定主控形状,则会隐式选择主控形状。我相信它总是
Tk
的第一个创建实例。在您的例子中,StringVar
是用root
作为其主节点创建的。因为这些Tk
实例是完全分离的,trywindow
和其中的所有小部件都无法“看到”其中的StringVar
或任何值。你知道吗因此,只需将
trywindow
传递给SringVar
构造即可修复代码:但是,将
trywindow
从Tk
实例更改为Toplevel
小部件可能更容易。这也会创建一个新窗口,但它属于同一个Tk
实例,因此在使用单独的Tk
实例时不会遇到这些困难:相关问题 更多 >
编程相关推荐