从另一个 Tk 实例调用 Tk 实例会导致问题设置文本变量

Calling a Tk instance from another Tk instance causes issue setting textvariables

我使用 Tkinterttk 构建了一个简单的用户下拉菜单。我使用 textvariable.set() 在加载时为 window 设置默认值。一切都很好。代码如下。

from Tkinter import *
import ttk
parent = Tk()

myvalue = StringVar()

user_entry1 = ttk.Combobox(parent, values=['value 1', 'value2'], textvariable=myvalue)
user_entry1.pack()
myvalue.set('default value')
mainloop()

我现在想变得更复杂一些,并使用另一个名为 rootTk() 实例来生成我的 parent Tk() 实例。一切似乎都正常,预计下拉列表的默认值不会显示。正如 print myvalue.get() 所证明的那样,它确实被分配给了文本变量。我在这里错过了什么?

from Tkinter import *
import ttk

root = Tk()

def load_dropdown():
    parent = Tk()
    myvalue = StringVar()

    user_entry1 = ttk.Combobox(parent, values=['value 1', 'value2'], textvariable=myvalue)
    user_entry1.pack()
    myvalue.set('default value')
    print myvalue.get()
    parent.mainloop()

b = Button(root, text="Generate Dropdown ", command=load_dropdown)
b.pack()
root.mainloop()

您不能在 tkinter 应用程序中多次使用 Tk 实例。您正在观察尝试这样做的负面影响之一。

如果您需要第二个 window,请创建 Toplevel 的实例而不是 Tk 的第二个实例。

在 tkinter 中,你只能创建一个主循环,由 root = Tk()

这是您的默认设置 window。如果您摆脱了 parent 的第二次创建,您的示例将起作用。

要创建更多 windows 使用 new_window = TopLevel()

关于 tkinter 有很多很好的文档,利用它会让你走得更远:)

http://effbot.org/tkinterbook/toplevel.htm

http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/toplevel.html

http://www.tkdocs.com/tutorial/windows.html

https://docs.python.org/2/library/tkinter.html

有两个 Tk 实例会混淆它。如果您希望在单独的顶层 window 中显示内容,请改为调用 Toplevel() 即可。

def load_dropdown():
    parent = Toplevel()  # <- change to this
    myvalue = StringVar()
    ...