tkinter Combobox 实现多选
时间: 2023-07-13 16:28:19 浏览: 513
在 Tkinter 中,Combobox 默认只支持单选,不支持多选。如果要实现多选功能,我们可以通过一些小技巧来实现。
一种方法是使用 Listbox 和 Scrollbar 来模拟多选的功能,具体步骤如下:
1. 创建 Combobox 和 Listbox 控件,并设置 Listbox 的多选模式为 EXTENDED。
2. 将 Listbox 放置在 Combobox 的下方,使用 pack 或 grid 等方法进行布局。
3. 绑定 Combobox 的点击事件,当点击 Combobox 时,显示 Listbox。
4. 绑定 Listbox 的选择事件,将选择的值添加到 Combobox 中,并更新 Combobox 的值。
下面是一个简单的示例代码:
```python
import tkinter as tk
from tkinter import ttk
class MultiCombobox(ttk.Combobox):
def __init__(self, master=None, **kw):
self.listbox = None
ttk.Combobox.__init__(self, master, **kw)
self.bind('<Button-1>', self.show_listbox)
def show_listbox(self, event):
if not self.listbox:
self.listbox = tk.Listbox(self.master, selectmode=tk.MULTIPLE)
self.listbox.bind('<FocusOut>', lambda event: self.listbox.pack_forget())
self.listbox.bind('<Escape>', lambda event: self.listbox.pack_forget())
self.listbox.bind('<<ListboxSelect>>', self.update_combobox)
self.listbox.pack()
self.listbox.delete(0, tk.END)
for value in self['values']:
self.listbox.insert(tk.END, value)
self.listbox.place(x=self.winfo_x(), y=self.winfo_y()+self.winfo_height())
self.listbox.focus_set()
def update_combobox(self, event):
selected_items = [self.listbox.get(idx) for idx in self.listbox.curselection()]
self.set(', '.join(selected_items))
# Example usage
root = tk.Tk()
root.geometry('200x200')
cb = MultiCombobox(root, values=['A', 'B', 'C', 'D'])
cb.pack()
root.mainloop()
```
这个示例代码中,我们继承了 ttk.Combobox 类,创建了一个新的类 MultiCombobox。在 MultiCombobox 中,我们创建了一个 Listbox,用于显示多选项。在点击 Combobox 时,会显示 Listbox,并将 Combobox 中的值添加到 Listbox 中。在选择 Listbox 中的值时,会更新 Combobox 的值。
阅读全文