1、使用StringVar初始化数据
from tkinter import *
import gjutil
# 初始化窗口
root = Tk()
root.title('listbox demo')
root.geometry(gjutil.getGeometry(root))
# 初始化数据
array_lang_data = ['python', 'golang', 'kotlin', 'dart', 'rust']
sv_lang_list = StringVar()
sv_lang_list.set(tuple(array_lang_data))
# 初始化控件
lb_lang = Listbox(root, listvariable=sv_lang_list)
lb_lang.pack()
root.mainloop()
显示效果如下
2、获取列表选择数据
通过 ListBox 的 curselection()
方法获取当前选中项角标,再通过 ListBox 获取数据源获取对应数据。
# 获取选中数据
def get_select_item():
try:
item = lb_lang.get(lb_lang.curselection())
label_select_display.config(text=item)
except:
mb.showerror(message="未选中任何选项")
label_select_display = Label(root)
btn_get_select = Button(root, text='获取数据', command=get_select_item)
label_select_display.pack()
btn_get_select.pack()
显示效果如下:
3、设置为多选,并获取选中项
为 ListBox 设置属性 selectmode=MULTIPLE
即可支持多选。
当 ListBox 是多选时,其 curselection()
方法获取到的是当前选中项角标元组。
select_items = []
def get_multi_select_items():
array_select_indexs = lb_lang.curselection()
if len(array_select_indexs) == 0:
mb.showerror(message='未选中任何选项')
return
select_items.clear()
for index in array_select_indexs:
select_items.insert(len(select_items), lb_lang.get(index))
label_select_display.config(text=' | '.join(select_items))
显示效果如下:
4、向列表中追加数据
通过 ListBox 的 insert
方法插入数据:
btn_insert_data = Button(root, text='添加数据', command=lambda lb=lb_lang:lb.insert('end', "item"))
修改数据源 StringVar 中的数据:
def add_data():
# 向数组中追加多条数据
array_lang_data.extend(('Java', 'C', 'C++'))
# 刷新 ListBox 数据源
sv_lang_list.set(tuple(array_lang_data))
5、删除列表中数据
通过 ListBox 的 delete
方法删除指定角标数据:
def delete_items():
array_select_indexs = lb_lang.curselection()
print(type(array_select_indexs))
if len(array_select_indexs) == 0:
mb.showerror(message='未选中任何选项')
return
for index in reversed(array_select_indexs):
lb_lang.delete(index)
也可以通过删除数据源中数据进行刷新,这里不再赘述。
6、附:全部代码
from tkinter import *
from tkinter import messagebox as mb
import gjutil
# 初始化窗口
root = Tk()
root.title('listbox demo')
root.geometry(gjutil.getGeometry(root))
# 初始化数据
array_lang_data = ['python', 'golang', 'kotlin', 'dart', 'rust']
sv_lang_list = StringVar()
sv_lang_list.set(tuple(array_lang_data))
# 初始化控件
lb_lang = Listbox(root, listvariable=sv_lang_list, selectmode=MULTIPLE, height=5)
# 获取单选选中数据
def get_select_item():
try:
item = lb_lang.get(lb_lang.curselection())
label_select_display.config(text=item)
except:
mb.showerror(message="未选中任何选项")
# 存储所有选中数据
select_items = []
# 获取多选选中数据
def get_multi_select_items():
array_select_indexs = lb_lang.curselection()
print(type(array_select_indexs))
if len(array_select_indexs) == 0:
mb.showerror(message='未选中任何选项')
return
select_items.clear()
for index in array_select_indexs:
select_items.insert(len(select_items), lb_lang.get(index))
label_select_display.config(text=' | '.join(select_items))
def add_data():
# 向数组中追加多条数据
array_lang_data.extend(('Java', 'C', 'C++'))
# 刷新 ListBox 数据源
sv_lang_list.set(tuple(array_lang_data))
def delete_items():
array_select_indexs = lb_lang.curselection()
print(type(array_select_indexs))
if len(array_select_indexs) == 0:
mb.showerror(message='未选中任何选项')
return
for index in reversed(array_select_indexs):
lb_lang.delete(index)
label_select_display = Label(root)
btn_get_select = Button(root, text='获取数据', command=get_multi_select_items)
btn_insert_data = Button(root, text='添加数据', command=lambda lb=lb_lang:lb.insert('end', "item"))
btn_insert_data2 = Button(root, text='添加数据2', command=add_data)
btn_delete_data = Button(root, text='删除选中项', command=delete_items)
lb_lang.pack()
label_select_display.pack()
btn_get_select.pack()
btn_insert_data.pack()
btn_insert_data2.pack()
btn_delete_data.pack()
root.mainloop()
标签:lang,控件,Tkinter,root,items,lb,array,Listbox,select
From: https://blog.51cto.com/u_16216552/7253830