Skip to main content
 首页 » 编程设计

python之如何从 0 属性函数中的 tkinter 顶层获取值

2025年05月04日20oomusou

如何在 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 和“”。我知道它是如何工作的,如果单选按钮不在顶层(或函数中),我可以获取值。但是我不知道如果结构是这样的话我该怎么做。

请您参考如下方法:

您问题的简短答案是您可以使用 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 可能不会按您预期的方式运行。