simpledialog或filedialog是非常方便使用的小部件。 我也想做:
- 像这些简单对话框一样在屏幕上弹出的模态窗口
- 内部组合框
- 当我在组合中选择一个值时,无需按钮即可返回此值
像这样:
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 窗口时调用该函数,那么最好使用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()