gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:15:00 24 4
gpt4 key购买 nike

如何在 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 可能不会按您预期的方式运行。

关于python - 如何从 0 属性函数中的 tkinter 顶层获取值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16058616/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com