我在tkinter上遇到问题StrinVar(),并且我对tkinter的了解不多,谢谢。
我所做的是我创建了两个窗口,如果您单击一个窗口的按钮,则每个窗口都有一个Entry小部件和Button小部件,然后该窗口退出,另一个窗口弹出,如果您在该弹出窗口中单击按钮,则它退出,并弹出一个原始窗口。这是代码:-
from tkinter import *
def x():
a1.set("")
a.withdraw()
b.deiconify()
def y():
b1.set("")
b.withdraw()
a.deiconify()
a=Tk()
a.withdraw()
a1=StringVar()
b1=StringVar()
Entry(a,textvariable=a1).pack()
Button(a,text="button1",command=x).pack()
a.withdraw()
b=Tk()
Entry(b,textvariable=b1).pack()
Button(b,text="button2",command=y).pack()
mainloop()
如果您在条目窗口小部件中写了一些东西,然后按button2,则弹出第二个窗口,然后再次弹出,如果您在条目窗口小部件中写了一些东西,然后按button1,则输入字段在上一个第一个窗口中没有得到更新。
我发现有人建议tkinter不应有两个实例Tk()
,而对于多个窗口使用Tk()
只能有一个实例Toplevel()
。因此,我将b=Tk()
更改为b=Toplevel()
可以正常工作,并且StringVar()
正在更新值
现在,我的问题是1)不使用两个实例StingVar()
更新Tk()
的原因/逻辑是什么?2)有什么方法可以使StringVar()
更新价值具有两个Tk()
答案 0 :(得分:0)
“ Tkinter只是一个用于导入Tk库的嵌入式Tcl解释器的python包装器。创建根窗口时,您将创建Tcl解释器的实例。
每个Tcl解释器都是一个隔离的沙箱。一个沙箱中的对象无法与另一个沙箱中的对象进行交互。最常见的体现是,在一个解释器中创建的StringVar在另一个解释器中不可见。小部件也是如此-您无法在一个解释器中创建作为父解释器的解释器,而该解释器作为父解释器。
从技术角度来看,没有理由不能同时拥有两个Tk实例。对此的建议是因为实际上很少需要两个或多个不同的Tcl解释器,并且它会引起初学者难以理解的问题。
99.9%的时间里最好的解决方案是创建一个Tk实例,该实例将在程序的整个生命周期中使用。很简单,这就是设计使用tkinter和基础的Tcl / Tk解释器的方式。 “--来自Bryan Oakley的Why are multiple instances of Tk discouraged?
#1 因此,当您创建a=Tk()
时,b=Tk()
中StringVar a1, b1
可用,但b=Tk()
中不可用。这就是为什么a=Tk()
中的值未更新的原因。
#2 如上所述,“在一个解释器中创建的StringVar在另一个解释器中不可见”。因此,没有办法让StringVar()具有两个实例Tk()来更新值。