如何使用 tkinter 组合创建类似简单对话框的 window?
How to create a simpledialog-like window with a combo with tkinter?
simpledialog 或 filedialog 是使用起来非常方便的小部件。
我也想这样做:
- modal window 像这些简单的对话框一样在屏幕上弹出
- 组合框里面
- 当我 select 组合中的一个值时,return 这个值 不需要按钮
类似于:
def askComboValue():
root = Tk() #how to pops up this window?
label = ttk.Label(root, text = "select your value")
label.pack()
box_value = ''
combo = ttk.Combobox(root, textvariable=box_value, values=['bla', 'bli', 'blo'])
combo.current(0)
combo.pack()
combo.bind("<<ComboboxSelected>>", returnValue) #how to catch this value?
root.grab_set_global() #is it the right way to make it modal?
root.mainloop()
return box_value #how to return this value?
有人知道怎么处理吗?
感谢您的帮助
如果在已经有 tkinter window 时调用该函数,那么最好使用 Toplevel()
而不是 Tk()
。另外 box_value
应该是 StringVar()
的实例。 grab_set()
也用于代替 grab_set_global()
。
以下是基于您的代码的示例:
import tkinter as tk
from tkinter import ttk
def askComboValue(*values):
top = tk.Toplevel() # use Toplevel() instead of Tk()
tk.Label(top, text='Select your value').pack()
box_value = tk.StringVar()
combo = ttk.Combobox(top, textvariable=box_value, values=values)
combo.pack()
combo.bind('<<ComboboxSelected>>', lambda _: top.destroy())
top.grab_set()
top.wait_window(top) # wait for itself destroyed, so like a modal dialog
return box_value.get()
def test():
result = askComboValue('bla', 'bli', 'blo')
print(result)
root = tk.Tk()
tk.Button(root, text='Test', command=test).pack()
root.mainloop()
simpledialog 或 filedialog 是使用起来非常方便的小部件。 我也想这样做:
- modal window 像这些简单的对话框一样在屏幕上弹出
- 组合框里面
- 当我 select 组合中的一个值时,return 这个值 不需要按钮
类似于:
def askComboValue():
root = Tk() #how to pops up this window?
label = ttk.Label(root, text = "select your value")
label.pack()
box_value = ''
combo = ttk.Combobox(root, textvariable=box_value, values=['bla', 'bli', 'blo'])
combo.current(0)
combo.pack()
combo.bind("<<ComboboxSelected>>", returnValue) #how to catch this value?
root.grab_set_global() #is it the right way to make it modal?
root.mainloop()
return box_value #how to return this value?
有人知道怎么处理吗? 感谢您的帮助
如果在已经有 tkinter window 时调用该函数,那么最好使用 Toplevel()
而不是 Tk()
。另外 box_value
应该是 StringVar()
的实例。 grab_set()
也用于代替 grab_set_global()
。
以下是基于您的代码的示例:
import tkinter as tk
from tkinter import ttk
def askComboValue(*values):
top = tk.Toplevel() # use Toplevel() instead of Tk()
tk.Label(top, text='Select your value').pack()
box_value = tk.StringVar()
combo = ttk.Combobox(top, textvariable=box_value, values=values)
combo.pack()
combo.bind('<<ComboboxSelected>>', lambda _: top.destroy())
top.grab_set()
top.wait_window(top) # wait for itself destroyed, so like a modal dialog
return box_value.get()
def test():
result = askComboValue('bla', 'bli', 'blo')
print(result)
root = tk.Tk()
tk.Button(root, text='Test', command=test).pack()
root.mainloop()