如何在Tkinter中获取Frame的行索引?解决grid_info报KeyError:'row'问题
报错原因
- 函数提前执行:初始代码中给按钮
command参数赋值时直接写了AddRemove(1)/AddRemove(2),这不是把函数绑定到点击事件,而是在创建按钮的那一刻就直接执行了AddRemove函数。此时buttonFrame还没有执行.grid()方法完成布局,调用.grid_info()会返回空字典,自然不存在row键,触发KeyError。 - 无布局调用grid_info:只要组件没有通过
.grid()方法放置到父容器中(或调用过.grid_forget()移除了布局),.grid_info()都会返回空字典,此时直接取row键就会报错。
解决方法
- 修正按钮事件绑定:给需要传参的回调函数包裹
lambda,实现点击按钮时才执行函数,初始代码的按钮定义修改为:
# 添加玩家按钮 addPlayer = Button(buttonFrame, text="Adicionar jogador", command=lambda: AddRemove(1)) addPlayer.grid(column=1, row=0) # 移除玩家按钮 removePlayer = Button(buttonFrame, text="Remover jogador", command=lambda: AddRemove(2)) removePlayer.grid_forget()
- 增加容错判断:调用
grid_info取行号前先判断返回结果是否为空,避免报错:
info = buttonFrame.grid_info() if not info: # 组件还未布局,直接返回或给默认行号 return row = info['row']
- 修正代码其他优化点:
- 不要在
AddRemove函数中重复创建addPlayer/removePlayer按钮,直接操作已经实例化的全局按钮对象调用grid()/grid_forget()即可,避免出现按钮重叠问题。 - grid布局的组件优先使用
.grid_forget()移除布局,不要用通用的.forget(),减少逻辑歧义。
- 不要在
内容的提问来源于stack exchange,提问作者dkol
相关产品推荐
相关产品推荐

