如何从0属性函数中获取tkinter toplevel的值?

PyJ*_*Jar 1 python get tkinter

如何从0属性函数中获取tkinter toplevel的值?

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)
Run Code Online (Sandbox Code Playgroud)
def updateB ():
    var, noteBox = Update()
    a = (var.get())
    b = (note.get())
Run Code Online (Sandbox Code Playgroud)

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

Bry*_*ley 6

对你的问题的简短回答是你可以使用wait_window()等待窗口被解除,然后你可以从你的函数返回你想要的任何东西.然后,您将连接"任务完成"按钮以简单地销毁窗口.

你必须非常小心,在这里- wait_window创建一个新的,嵌套的事件循环.大多数情况下,这是与窗口抓取一起完成的,以防止处理其他窗口中的事件.执行此操作时,您将创建一个模式对话框.

这是一个有效的例子; 我不得不稍微调整你的代码,我冒昧地删除了一些不必要的变量(例如对radiobuttons的引用,因为你从不对引用做任何事情)

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()
Run Code Online (Sandbox Code Playgroud)

要了解使用此功能时必须小心的原因,请尝试以下方案:

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

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

  3. 单击"打开窗口"按钮,然后再次单击它.你现在有两个窗口.这一次,填写第一个窗口,然后单击"任务完成".请注意,它并没有 将结果输出到屏幕上.这是因为第一个窗口的嵌套事件循环无法完成,直到第三个窗口的嵌套的事件循环完成.填写第二个窗口的表格,然后点击"任务完成",你会看到两个嵌套的事件循环放松,但不是在你点击"任务完成",而是在为了使窗户的顺序创建.

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