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()
在执行此代码后,根据我的说法,第二个窗口应显示输入文本为“ PRINTED”的输入块,但它为空白。
答案 0 :(得分:0)
如评论中所述,不建议使用Tk()
的多个实例。它会导致人们意想不到的行为,这个问题就是一个很好的例子。
如this answer中所述,Tk
的所有实例都是完全隔离的。 “属于”其中一个对象无法在其他对象中看到或使用。
代码中发生的事情是,您有两个Tk
实例:root
和trywindow
。然后,您创建一个StringVar
,不带任何参数。这是通常的方法,但是实际上您可以在构建过程中提供一个主窗口小部件。这样,您可以控制Tk
“所属”到哪个StringVar
实例。请参见effbot的引言:
仅当您在多个Tk实例上运行Tkinter时,构造函数参数才有意义(除非您真的知道自己在做什么,否则不应该这样做)。
如果不指定母版,则会隐式选择一个母版。我确实相信它始终是Tk
的第一个创建实例。在您的情况下,StringVar
是以root
作为主文件创建的。由于这些Tk
实例是完全分开的,因此trywindow
及其中的所有小部件都无法“看到” StringVar
或其中的任何值。
因此您可以通过简单地将trywindow
传递到SringVar
结构来修复代码:
s=StringVar(trywindow)
但是,将trywindow
从Tk
实例更改为Toplevel
小部件可能更容易。这也会创建一个新窗口,但它属于同一Tk
实例,因此使用单独的Tk
实例不会遇到这些困难:
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()