如何使用tkinter的组合创建simpledialoglike窗口?

2024-06-25 23:42:56 发布

您现在位置:Python中文网/ 问答频道 /正文

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

  1. 模式窗口在屏幕上弹出,就像这些简单的对话框
  2. 组合框内部
  3. 当我在combo中选择一个值时,返回该值,而不需要按钮

比如:

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?

有人知道怎么处理吗? 谢谢你的帮助


Tags: toboxreturnvalueitrootthislabel
1条回答
网友
1楼 · 发布于 2024-06-25 23:42:56

如果在已经有tkinter窗口时调用该函数,那么最好使用Toplevel()而不是Tk()。另外box_value应该是StringVar()的实例^也使用{}代替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()

相关问题 更多 >