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不在顶层(或在函数中),则可以获得值.但是如果结构是这样的话,我无法弄明白我怎么能这样做.
对你的问题的简短回答是你可以使用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)
要了解使用此功能时必须小心的原因,请尝试以下方案:
单击"打开窗口"按钮,填写表单并单击"任务完成"按钮.请注意,它可能以您期望的方式工作(它打印到stdout,因此请确保您从控制台窗口运行)
单击"打开窗口"按钮,然后再次单击它.你现在有两个窗口.填写第二个窗口,单击"任务完成"并注意它的工作方式与您预期的一样.现在填写第一个窗口,然后单击"任务完成",它仍然可以正常工作.在这两种情况下,当您单击按钮时,它会将正确的值打印到屏幕上.
单击"打开窗口"按钮,然后再次单击它.你现在有两个窗口.这一次,填写第一个窗口,然后单击"任务完成".请注意,它并没有 将结果输出到屏幕上.这是因为第一个窗口的嵌套事件循环无法完成,直到第三个窗口的嵌套的事件循环完成.填写第二个窗口的表格,然后点击"任务完成",你会看到两个嵌套的事件循环放松,但不是在你点击"任务完成",而是在为了使窗户的顺序创建.
这就是你在使用时需要小心的原因wait_window- 你应该防止这种事件循环的递归嵌套,否则你的GUI可能不会按照你期望的方式运行.