【问题标题】:Tkinter .set and .get not working in a window inside a windowTkinter .set 和 .get 在窗口内的窗口中不起作用
【发布时间】:2019-08-08 02:01:15
【问题描述】:
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”文本,但它是空白的。

【问题讨论】:

  • Tk() 的多个实例根本无法正常工作。改用Toplevel() 来创建额外的窗口。
  • @jasonharper 与其说它们不工作正确,不如说如果你不完全理解实例,它们就不会按照你期望的方式工作Tk 实际上是。
  • 为什么您认为调用.get() 不起作用?您的代码中没有任何地方调用它。

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


【解决方案1】:

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

this answer 中所述,Tk 的所有实例都是完全隔离的。 “属于”其中一个的对象不能在其他对象中看到或使用。
您的代码中发生的情况是您有两个Tk 实例:roottrywindow。然后你创建一个StringVar,不带任何参数。这是执行此操作的常用方法,但实际上您可以在构建期间提供主小部件。这样,您可以控制您的StringVar“属于”哪个Tk 实例。请参阅来自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()

【讨论】:

    猜你喜欢
    • 2013-10-21
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    相关资源
    最近更新 更多