如何使用 tkinter 组合创建类似简单对话框的 window?

How to create a simpledialog-like window with a combo with tkinter?

simpledialog 或 filedialog 是使用起来非常方便的小部件。 我也想这样做:

  1. modal window 像这些简单的对话框一样在屏幕上弹出
  2. 组合框里面
  3. 当我 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()