我如何 return 对话框的结果?
How do I return a result from a dialog?
我已经创建了一个对话框,一切都很好,除非我以某种方式 return 结果 。从对话框中获取用户选择的问题在于我们不知道 he/she 何时会单击,例如 ok
或 cancel
。
我试图查看标准对话框是如何实现的,以便做类似的事情。我注意到所有打开对话框的函数,如 askdirectory
或 askopenfile
调用 Dialog
的方法 show
。所以我决定看看这个方法,但我没有完全看到这个方法与能够等待用户的 answer/action 到 return 某个值的事实之间的关系。
我们如何才能 return 来自对话框的一些值?
基本机制是有一个函数创建 window(或使其可见),等待它被销毁(使用 wait_window
),从window,然后是 return 的值。你会想要使用 StringVar
或类似的东西,它不会与 window.
一起被破坏
这是一个要求您输入字符串的对话框示例。您可以通过按 return 键、单击 "OK" 按钮或使用 window 管理器按钮关闭 window 来关闭对话框。当您关闭对话框时,字符串将显示在主 window.
中
import Tkinter as tk
class CustomDialog(tk.Toplevel):
def __init__(self, parent, prompt):
tk.Toplevel.__init__(self, parent)
self.var = tk.StringVar()
self.label = tk.Label(self, text=prompt)
self.entry = tk.Entry(self, textvariable=self.var)
self.ok_button = tk.Button(self, text="OK", command=self.on_ok)
self.label.pack(side="top", fill="x")
self.entry.pack(side="top", fill="x")
self.ok_button.pack(side="right")
self.entry.bind("<Return>", self.on_ok)
def on_ok(self, event=None):
self.destroy()
def show(self):
self.wm_deiconify()
self.entry.focus_force()
self.wait_window()
return self.var.get()
class Example(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.button = tk.Button(self, text="Get Input", command=self.on_button)
self.label = tk.Label(self, text="", width=20)
self.button.pack(padx=8, pady=8)
self.label.pack(side="bottom", fill="both", expand=True)
def on_button(self):
string = CustomDialog(self, "Enter something:").show()
self.label.configure(text="You entered:\n" + string)
if __name__ == "__main__":
root = tk.Tk()
root.wm_geometry("400x200")
Example(root).pack(fill="both", expand=True)
root.mainloop()
截图:
我已经创建了一个对话框,一切都很好,除非我以某种方式 return 结果 。从对话框中获取用户选择的问题在于我们不知道 he/she 何时会单击,例如 ok
或 cancel
。
我试图查看标准对话框是如何实现的,以便做类似的事情。我注意到所有打开对话框的函数,如 askdirectory
或 askopenfile
调用 Dialog
的方法 show
。所以我决定看看这个方法,但我没有完全看到这个方法与能够等待用户的 answer/action 到 return 某个值的事实之间的关系。
我们如何才能 return 来自对话框的一些值?
基本机制是有一个函数创建 window(或使其可见),等待它被销毁(使用 wait_window
),从window,然后是 return 的值。你会想要使用 StringVar
或类似的东西,它不会与 window.
这是一个要求您输入字符串的对话框示例。您可以通过按 return 键、单击 "OK" 按钮或使用 window 管理器按钮关闭 window 来关闭对话框。当您关闭对话框时,字符串将显示在主 window.
中import Tkinter as tk
class CustomDialog(tk.Toplevel):
def __init__(self, parent, prompt):
tk.Toplevel.__init__(self, parent)
self.var = tk.StringVar()
self.label = tk.Label(self, text=prompt)
self.entry = tk.Entry(self, textvariable=self.var)
self.ok_button = tk.Button(self, text="OK", command=self.on_ok)
self.label.pack(side="top", fill="x")
self.entry.pack(side="top", fill="x")
self.ok_button.pack(side="right")
self.entry.bind("<Return>", self.on_ok)
def on_ok(self, event=None):
self.destroy()
def show(self):
self.wm_deiconify()
self.entry.focus_force()
self.wait_window()
return self.var.get()
class Example(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.button = tk.Button(self, text="Get Input", command=self.on_button)
self.label = tk.Label(self, text="", width=20)
self.button.pack(padx=8, pady=8)
self.label.pack(side="bottom", fill="both", expand=True)
def on_button(self):
string = CustomDialog(self, "Enter something:").show()
self.label.configure(text="You entered:\n" + string)
if __name__ == "__main__":
root = tk.Tk()
root.wm_geometry("400x200")
Example(root).pack(fill="both", expand=True)
root.mainloop()
截图: