tkinter多选下拉列表
时间: 2023-12-13 22:04:39 浏览: 31
以下是一个使用tkinter实现多选下拉列表的例子:
```python
import tkinter as tk
from tkinter import ttk
class MultiCombobox(ttk.Combobox):
def __init__(self, master, values, **kw):
self.values = values
self.var = tk.StringVar()
kw["textvariable"] = self.var
ttk.Combobox.__init__(self, master, **kw)
self.bind("<FocusIn>", self.popup)
self.bind("<FocusOut>", self.unpost)
self.listbox = None
self.posted = False
self.selection = []
def popup(self, event):
if not self.posted:
self.listbox = tk.Listbox(self, height=len(self.values))
self.listbox.configure(font=self.cget("font"),
width=self.cget("width"))
self.listbox.bind("<ButtonRelease-1>", self._select)
self.listbox.bind("<Escape>", lambda event: self.unpost())
self.listbox.place(in_=self, relx=0, rely=1)
for value in self.values:
self.listbox.insert("end", value)
self.listbox.selection_clear(0, "end")
for index in self.selection:
self.listbox.selection_set(index)
self.posted = True
def unpost(self, event=None):
if self.listbox:
self.selection = self.listbox.curselection()
self.var.set(", ".join([self.values[index] for index in self.selection]))
self.listbox.destroy()
self.listbox = None
self.posted = False
def _select(self, event):
self.selection = self.listbox.curselection()
self.var.set(", ".join([self.values[index] for index in self.selection]))
self.listbox.destroy()
self.listbox = None
self.posted = False
if __name__ == "__main__":
root = tk.Tk()
values = ["选项1", "选项2", "选项3", "选项4", "选项5", "选项6"]
cb = MultiCombobox(root, values=values, state="readonly")
cb.pack()
root.mainloop()
```