Tkinter .set和.get在窗口内的窗口中不起作用

时间:2019-03-17 15:47:45

标签: python python-3.x user-interface tkinter tkinter-entry

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”的输入块,但它为空白。

1 个答案:

答案 0 :(得分:0)

如评论中所述,不建议使用Tk()的多个实例。它会导致人们意想不到的行为,这个问题就是一个很好的例子。

this answer中所述,Tk的所有实例都是完全隔离的。 “属于”其中一个对象无法在其他对象中看到或使用。
代码中发生的事情是,您有两个Tk实例:roottrywindow。然后,您创建一个StringVar,不带任何参数。这是通常的方法,但是实际上您可以在构建过程中提供一个主窗口小部件。这样,您可以控制Tk“所属”到哪个StringVar实例。请参见effbot的引言:

  

仅当您在多个Tk实例上运行Tkinter时,构造函数参数才有意义(除非您真的知道自己在做什么,否则不应该这样做)。

如果不指定母版,则会隐式选择一个母版。我确实相信它始终是Tk的第一个创建实例。在您的情况下,StringVar是以root作为主文件创建的。由于这些Tk实例是完全分开的,因此trywindow及其中的所有小部件都无法“看到” StringVar或其中的任何值。

因此您可以通过简单地将trywindow传递到SringVar结构来修复代码:

s=StringVar(trywindow)

但是,将trywindowTk实例更改为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()