如何同时从Tkinter Listbox中选择?
在Tkinter中,Listbox是一个常见的控件,它允许用户从一个列表中选择一个或多个选项。当需要从Listbox中选择多个选项时,有几种方法可以实现。
一、使用多选模式
在Tkinter中,默认情况下,Listbox只允许单选。但是可以通过设置selectmode
参数为MULTIPLE
来使用多选模式,同时按住Ctrl
键选择多个选项,也可以按住鼠标连续选择多个选项。
示例代码:
import tkinter as tk
root = tk.Tk()
# 创建一个Listbox,启用多选模式
my_listbox = tk.Listbox(root, selectmode=tk.MULTIPLE)
my_listbox.pack()
# 添加选项
for item in ['apple', 'banana', 'orange', 'grape']:
my_listbox.insert(tk.END, item)
root.mainloop()
二、使用Shift键选择范围
除了使用多选模式,在Listbox中还可以使用Shift
键选择范围。在多选模式下,当按下Shift
键并选择一个选项时,Listbox会选中起始点和结束点之间的所有选项。
示例代码:
import tkinter as tk
root = tk.Tk()
# 创建一个Listbox,启用多选模式
my_listbox = tk.Listbox(root, selectmode=tk.MULTIPLE)
my_listbox.pack()
# 添加选项
for item in ['apple', 'banana', 'orange', 'pear', 'grape']:
my_listbox.insert(tk.END, item)
# 为Listbox绑定Shift键事件
def select_range(event):
# 当按下Shift键时,通过curselection方法获取当前所有选项的index
cur_selection = my_listbox.curselection()
if len(cur_selection) > 1:
# 找到起始点和结束点
start = int(cur_selection[0])
end = int(cur_selection[-1])
# 按住Shift键选择范围
my_listbox.selection_clear(0, tk.END)
my_listbox.selection_set(start, end+1)
my_listbox.bind("<Shift-Button-1>", select_range)
root.mainloop()
三、使用复选框
如果需要在Listbox中同时选择多个选项,并进行一些复杂的操作,可以考虑使用附带复选框的Listbox。
示例代码:
import tkinter as tk
import tkinter.font as tkFont
root = tk.Tk()
root.geometry('200x200')
root.resizable(False, False)
# 建立带复选框的Listbox
my_listbox = tk.Listbox(root, selectmode=tk.EXTENDED, height=7)
my_listbox.pack()
# 设置字体和颜色
font_normal = tkFont.Font(size=10)
font_selected = tkFont.Font(size=10, weight='bold')
my_listbox.configure(font=font_normal, bg='#f5f5f5')
# 滚动条
yscrollbar = tk.Scrollbar(root)
yscrollbar.pack(side=tk.RIGHT, fill=tk.Y)
my_listbox.config(yscrollcommand=yscrollbar.set)
yscrollbar.config(command=my_listbox.yview)
# 添加选项
for item in ['apple', 'banana', 'orange', 'pear', 'grape']:
my_listbox.insert(tk.END, item)
# 切换字体样式
def toggle_font(event=None):
# 获取当前选中项的index
cur_selection = my_listbox.curselection()
for i in range(my_listbox.size()):
# 设置选中项的字体样式
if i in cur_selection:
my_listbox.itemconfig(i, font=font_selected)
else:
my_listbox.itemconfig(i, font=font_normal)
# 为所有选项添加复选框
def add_checkbox():
for i in range(my_listbox.size()):
my_listbox.itemconfig(i, bg='white')
var = tk.BooleanVar()
cb = tk.Checkbutton(my_listbox, var=var, cursor="hand2")
# 为每个选项设置复选框
my_listbox.itemconfig(i, bg='white', fg='#303030')
my_listbox.itemconfigure(i, {'yscrollcommand':cb.on})
cb.grid(row=i, column=0, pady=1, padx=5, sticky='w')
add_checkbox()
# 为每个复选框添加绑定事件
def callback(event=None):
toggle_font()
print()
for i in range(my_listbox.size()):
my_listbox.bind(('<<ListboxSelect>>', '<Button-1>'), callback)
root.mainloop()
结论
在Tkinter中,Listbox提供了多种选择多个选项的方法,如多选模式、使用Shift键选择范围和使用附带复选框的Listbox。在实际应用中,可以根据需求选择不同的方法来选择多个选项。