在风中,不要在窗户里工作

2024-09-30 18:28:07 发布

您现在位置:Python中文网/ 问答频道 /正文

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

据我说,执行此代码后,第二个窗口应该显示输入块与文字写在它“打印”,但它是空白的。你知道吗


Tags: fromimporttkinterdefroottkprintentry
1条回答
网友
1楼 · 发布于 2024-09-30 18:28:07

如注释中所述,不鼓励使用多个Tk()实例。它会导致人们意想不到的行为,这个问题就是一个很好的例子。你知道吗

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

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构造即可修复代码:

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

相关问题 更多 >