【问题标题】:Calling a Tk instance from another Tk instance causes issue setting textvariables从另一个 Tk 实例调用 Tk 实例会导致问题设置 textvariables
【发布时间】:2015-09-23 17:58:45
【问题描述】:

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

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

【问题讨论】:

    标签: python python-2.7 tkinter ttk


    【解决方案1】:

    有两个Tk 实例会混淆它。如果您希望将内容显示在单独的顶级窗口中,请致电Toplevel(),一切都会正常进行。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        这是您的默认窗口。如果您摆脱父级的第二次创建,您的示例将起作用。

        要创建更多窗口,请使用 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

        【讨论】:

          猜你喜欢
          • 2019-06-07
          • 2016-06-06
          • 2018-06-11
          相关资源
          最近更新 更多