1

如何从 0 属性函数侧的 tkinter 顶层获取值?

def Update():  
    Up = Toplevel()
    Up.title("Update")
    taskLabel = Label(Up, text ="Update", font=('Times', 20)).grid(row=0)

    var = IntVar()
    radio = Radiobutton(Up, text="Fully", variable=var, value=1, command = taskUpdate).grid(row=2, sticky=W)

    radio = Radiobutton(Up, text="Partly", variable=var, value=2, command = taskUpdate).grid(row=3, sticky=W)

    radio = Radiobutton(Up, text="Un", variable=var, value=3, command = taskUpdate).grid(row=4, sticky=W)

    note = EntryaUp, width=30, font=('Arial', 12,)).grid(row=6)
    Button = Button(Up, text ="Task Complete and Send Invoice", command = taskUpdate).grid(row =7)

    return (var, note)

def updateB ():
    var, noteBox = Update()
    a = (var.get())
    b = (note.get())

这是 tkinter 中的顶级窗口,我想在单击单选按钮时获取值 1,2,3,并在我在条目中输入文本并单击命令按钮时获取字符串值,但我只是不知道我怎样才能做到这一点。顺便说一句,我认为我根本无法返回该值,每次返回时它只返回初始值,即 0 和“”。我知道它是如何工作的,并且如果单选按钮不在顶层(或在函数中),我可以获得值。但是如果结构是这样的,我无法弄清楚我该怎么做。

4

1 回答 1

7

对您的问题的简短回答是,您可以使用wait_window()等待窗口被关闭,然后您可以从函数中返回您想要的任何内容。然后,您将连接“任务完成”按钮以简单地销毁窗口。

您必须非常小心——wait_window创建一个嵌套事件循环。大多数情况下,这与窗口抓取一起完成,以防止处理其他窗口中的事件。当你这样做时,你正在创建一个模态对话框。

这是一个工作示例;我不得不稍微调整一下你的代码,我冒昧地删除了一些不必要的变量(例如对单选按钮的引用,因为你从不对引用做任何事情)

import Tkinter as tk # python 2.7 

class Example(tk.Frame):
    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)
        button = tk.Button(self, text="Open window", command=self.on_button)
        button.pack()

    def on_button(self):
        var, note = Update()
        a = var.get()
        b = note.get()
        print "a: '%s' b: '%s'" % (a,b)

def Update():
    Up = tk.Toplevel()
    Up.title("Update")
    tk.Label(Up, text ="Update", font=('Times', 20)).grid(row=0)

    var = tk.IntVar()
    tk.Radiobutton(Up, text="Fully", variable=var, value=1).grid(row=2, sticky="w")
    tk.Radiobutton(Up, text="Partly", variable=var, value=2).grid(row=3, sticky="w")
    tk.Radiobutton(Up, text="Un", variable=var, value=3).grid(row=4, sticky="w")

    evar = tk.StringVar()
    note = tk.Entry(Up, width=30, font=('Arial', 12,), textvariable=evar)
    note.grid(row=6)

    Button = tk.Button(Up, text ="Task Complete and Send Invoice", command = Up.destroy).grid(row =7)

    Up.wait_window()
    print "done waiting..."
    return (var, evar)

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(side="top", fill="both", expand=True)
    root.mainloop()

要了解为什么在使用此功能时必须小心,请尝试以下场景:

  1. 单击“打开窗口”按钮,填写表格并单击“任务完成”按钮。请注意,它可能以您期望的方式工作(它打印到标准输出,因此请确保您是从控制台窗口运行的)

  2. 单击“打开窗口”按钮,然后再次单击它。你现在有两个窗口。填写第二个窗口,单击“任务完成”并注意它的工作方式与您预期的一样。现在填写第一个窗口并单击“任务完成”,它仍然可以正常工作。在这两种情况下,当您单击按钮时,它都会将正确的值打印到屏幕上。

  3. 单击“打开窗口”按钮,然后再次单击它。你现在有两个窗口。这次,填写第一个窗口,然后单击“任务完成”。请注意,它不会 结果打印到屏幕上。这是因为在第三个窗口的嵌套事件循环完成之前,第一个窗口的嵌套事件循环无法完成。填写第二个窗口的表格并单击“任务完成”,您会看到两个嵌套的事件循环展开,但不是按照您单击“任务完成”的顺序,而是按照窗口的顺序创建的。

这就是为什么您在使用时需要小心的原因wait_window——您应该防止这种事件循环的递归嵌套,否则您的 GUI 可能不会按照您期望的方式运行。

于 2013-04-17T16:40:16.980 回答