关于tkinter StringVar()

时间:2019-01-06 06:49:38

标签: python tkinter

我在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()

的实例

1 个答案:

答案 0 :(得分:0)

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

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

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

99.9%的时间里最好的解决方案是创建一个Tk实例,该实例将在程序的整个生命周期中使用。很简单,这就是设计使用tkinter和基础的Tcl / Tk解释器的方式。 “--来自Bryan OakleyWhy are multiple instances of Tk discouraged?

#1 因此,当您创建a=Tk()时,b=Tk()StringVar a1, b1可用,但b=Tk()中不可用。这就是为什么a=Tk()中的值未更新的原因。

#2 如上所述,“在一个解释器中创建的StringVar在另一个解释器中不可见”。因此,没有办法让StringVar()具有两个实例Tk()来更新值。