Python Tkinter如何从Listbox或按钮将选中值返回至列表
解决方案
Tkinter中Button组件绑定的command回调函数的返回值会被框架默认丢弃,所以你现在直接在select_ingredients里return列表是没法在外部拿到的,可参考以下两种常用方案实现需求:
方案1:用外层可变容器存储结果(改动最小)
直接在全局作用域定义一个可变容器(比如列表)存储选中结果,回调函数里直接修改这个容器的内容,后续其他代码可以直接读取该容器拿到选中列表,修改后的代码如下:
from tkinter import * root = Tk() root.title("blabla") root.geometry("600x650") # 定义全局列表存储选中的食材 selected_ingredients = [] Label(text="", width=15).grid(row=0, column=0) Label(text="选择食材:", width=15).grid(row=1, column=0) ingredients_listbox = Listbox(root, width=20, height=10, selectmode=MULTIPLE) ingredients_listbox.grid(row=2, column=0) # 给列表框添加垂直滚动条 ingredients_scroll = Scrollbar(command=ingredients_listbox.yview, orient=VERTICAL) ingredients_scroll.grid(row=2, column=1, sticky='ns') ingredients_listbox.configure(yscrollcommand=ingredients_scroll.set) ingredients_list = ["无","茄子","红甜椒","番茄","洋葱","大蒜","香菜", "西葫芦","洋蓟","蘑菇","橄榄","欧芹","花菜"] for item in ingredients_list: ingredients_listbox.insert(END, item) def select_ingredients(): global selected_ingredients # 清空上一次的选中结果 selected_ingredients.clear() for idx in ingredients_listbox.curselection(): selected_ingredients.append(ingredients_listbox.get(idx)) print("当前选中食材:", selected_ingredients) ingredients_button = Button(root, text = "添加食材", command = select_ingredients).grid(row=3, column=0) # 示例:其他位置直接读取selected_ingredients即可使用选中列表 def check_result(): print("外部读取到的选中列表:", selected_ingredients) Button(root, text="测试读取选中结果", command=check_result).grid(row=4, column=0) root.mainloop()
方案2:类封装GUI(适合复杂项目)
如果你的GUI功能比较复杂,更推荐用类封装所有组件和状态,避免全局变量污染,示例如下:
from tkinter import * class IngredientSelector: def __init__(self, root): self.root = root self.root.title("blabla") self.root.geometry("600x650") # 实例属性存储选中结果 self.selected_ingredients = [] Label(text="", width=15).grid(row=0, column=0) Label(text="选择食材:", width=15).grid(row=1, column=0) self.ingredients_listbox = Listbox(root, width=20, height=10, selectmode=MULTIPLE) self.ingredients_listbox.grid(row=2, column=0) ingredients_scroll = Scrollbar(command=self.ingredients_listbox.yview, orient=VERTICAL) ingredients_scroll.grid(row=2, column=1, sticky='ns') self.ingredients_listbox.configure(yscrollcommand=ingredients_scroll.set) ingredients_list = ["无","茄子","红甜椒","番茄","洋葱","大蒜","香菜", "西葫芦","洋蓟","蘑菇","橄榄","欧芹","花菜"] for item in ingredients_list: self.ingredients_listbox.insert(END, item) Button(root, text = "添加食材", command = self.select_ingredients).grid(row=3, column=0) Button(root, text="测试读取选中结果", command=self.check_result).grid(row=4, column=0) def select_ingredients(self): self.selected_ingredients.clear() for idx in self.ingredients_listbox.curselection(): self.selected_ingredients.append(self.ingredients_listbox.get(idx)) print("当前选中食材:", self.selected_ingredients) def check_result(self): print("外部读取到的选中列表:", self.selected_ingredients) if __name__ == "__main__": root = Tk() app = IngredientSelector(root) root.mainloop()
两种方案都可以拿到选中的列表,你可以根据自己项目的复杂度选择对应的实现方式。
内容的提问来源于stack exchange,提问作者נועה בינסקי
相关产品推荐
相关产品推荐

