Tkinter开发:如何修改for循环创建的对应按钮绑定的文本而非最后一个
问题根因
- 闭包延迟绑定问题:你仅给lambda的
key参数做了默认参数值捕获,value没有做捕获,受Python闭包的延迟绑定特性影响,所有按钮触发回调时取到的value都是循环最后一轮迭代的值,所以只会修改最后一个技能的计数。 - 未存储对应文本ID:你没有保存每个技能对应的
countText画布文本对象ID,就算拿到正确的参数,也无法定位到需要修改的对应计数文本。 - 按钮存储错误:
Button.place()方法返回值为None,你现在append到useRedBtn列表里的全是空值,后续无法对按钮本身做状态控制。
修复方案
首先新增字典存储技能和对应计数文本的映射,修改循环逻辑:
# 新增字典,存储技能名对应计数文本的ID skill_count_map = {} for key,value in Char.getRedSkill().items(): text = skillCanvas.create_text(320, y5, text=key, font=("Helvetica", 15), anchor='w') countText = skillCanvas.create_text(600, y5, text=value, font=("Helvetica", 15), anchor='w') # 存入映射字典 skill_count_map[key] = countText # 先实例化按钮,再调用place,避免存储None btn = Button(skillCanvas, text="USE", # value也要加默认参数做捕获 command=lambda key=key, value=value: useSkill(key,value,root), font=("Helvetica", 10)) btn.place(x=630, y=y5-15) useRedBtn.append(btn) y5 += 30
然后修改useSkill函数,计数更新后同步修改画布文本:
def useSkill(key, current_val, root): # 原有技能逻辑执行完成后,更新计数 new_val = current_val - 1 # 更新画布上的对应计数文本 skillCanvas.itemconfig(skill_count_map[key], text=str(new_val)) # 同步更新Char对象里存储的技能数值,避免后续读取为旧值 Char.getRedSkill()[key] = new_val
内容的提问来源于stack exchange,提问作者Chissanu Kittipakorn
相关产品推荐
相关产品推荐

