Tkinter Listbox取消选中时删除标签及选中项分行显示问题
Tkinter多选Listbox选中项同步展示修复方案
问题核心原因
- 每次触发选择事件时重复创建新Label,旧Label内容不会被自动清除
- 选中项拼接使用逗号分隔,没有用换行符
- 同步逻辑错误,没有直接关联当前选中集合和Label展示内容
修正后的完整代码
from tkinter import * import tkinter as tk class Application(tk.Tk): def __init__(self): tk.Tk.__init__(self) self.listNumber = ['One', 'Two', 'Three', 'Four', 'Five', 'Six'] self.labellist = tk.Label(self, text=' Select a number : ') self.labellist.place(x=40, y=30) self.frame = Frame(self) self.frame.place(x=200, y=30) self.list = Listbox(self.frame, exportselection=False, height=5, selectmode="multiple") self.list.pack(side='left', fill='y') for each_item in range(len(self.listNumber)): self.list.insert(END, self.listNumber[each_item]) self.scrollbar = Scrollbar(self.frame, orient="vertical", command=self.list.yview) self.scrollbar.pack(side='right', fill='y') self.list.config(yscrollcommand=self.scrollbar.set) self.list.bind('<<ListboxSelect>>',self.printSelection) self.buttonExecute = tk.Button(self, text='Execute', fg='White', bg='dark green', height=1, width=10, command=self.destroy) self.buttonExecute.place(x=225, y=150) # 提前初始化右侧展示Label,不要每次动态创建 self.result_label = tk.Label(self, text=' Number selected:\n', justify=tk.LEFT, anchor='nw', height=6) self.result_label.place(x=350, y=30) def printSelection(self, evt): # 直接获取当前所有选中项 values = [self.list.get(idx) for idx in self.list.curselection()] # 用换行符拼接实现每行一个 show_text = ' Number selected:\n' + '\n'.join(values) # 直接更新Label文本即可自动同步增删 self.result_label.config(text=show_text) if __name__ == "__main__": app = Application() app.geometry("600x250") app.mainloop()
关键修改说明
- 移除了无用的
previous_selected变量和对应判断逻辑,直接每次取当前选中集合更新内容 - 提前在
__init__中创建结果展示Label,后续仅更新文本属性,避免重复创建组件导致的内容残留 - 选中项拼接符从
,改为\n,同时给Label设置左对齐属性,保证多行内容排版正常 - 选中项变更时无需手动删除旧内容,直接用最新选中集合生成文本覆盖即可自动实现取消选中时同步删除对应内容
内容的提问来源于stack exchange,提问作者Romain
相关产品推荐
相关产品推荐

