如何获取Tkinter数组中被点击按钮的索引
获取Tkinter按钮数组中被点击按钮的索引方法
我将若干按钮存储在数组中:
buttons = [],并执行了如下初始化操作:labels.append(tk.Label(fr2, text="", pady=15)) labels.append(tk.Label(fr3, text="", pady=15))随后我读取数据库表数据,通过for in循环遍历所有记录,为每条记录创建并布局对应的Label与Button组件,代码如下:
i = 0 if len(records) > 0: for row in records: print("current_date", ", target date") print(current_date, row[2]) date = current_date - row[2] labels[i] = tk.Label(fr2, text=row[1], pady=15) labels[i].grid(row=i, column=0, sticky='we') labels[i+1] = tk.Label(fr3, text=date, pady=15) labels[i+1].grid(row=i, column=0, sticky='we') buttons[i] = tk.Button(fr4, text="Restart", command=restart, pady=13) buttons[i].grid(row=i, column=0, sticky='we') buttons[i+1] = tk.Button(fr5, text="Delete", command=delete, pady=13) buttons[i+1].grid(row=i, column=0, sticky='we') i = i + 1请问在程序运行过程中,如何获取当前被点击按钮在buttons数组中的索引?
这个问题在Tkinter开发里太常见了——你直接把restart或delete绑给按钮的command,函数根本没法知道到底是哪个按钮被触发了。核心思路就是把按钮的索引“传递”给回调函数,这里给你两种实用的实现方式:
方法一:用lambda表达式绑定索引
创建按钮时,用lambda把当前循环的索引作为参数传给回调函数。注意一定要把索引作为lambda的默认参数固定住,不然所有按钮最后都会拿到循环结束后的索引值(这是Python循环变量的常见陷阱)。
修改你的按钮创建代码:
# 创建Restart按钮,绑定索引i buttons[i] = tk.Button(fr4, text="Restart", command=lambda idx=i: restart(idx), pady=13) # 创建Delete按钮,绑定索引i+1 buttons[i+1] = tk.Button(fr5, text="Delete", command=lambda idx=i+1: delete(idx), pady=13)
对应的回调函数要改成接收索引参数的形式:
def restart(idx): print(f"点击了Restart按钮,数组索引为: {idx}") # 这里可以通过buttons[idx]拿到对应的按钮对象,执行后续逻辑 def delete(idx): print(f"点击了Delete按钮,数组索引为: {idx}") # 同理操作buttons[idx]
方法二:用functools.partial绑定参数
如果觉得lambda的写法不够直观,也可以用functools.partial来包装回调函数,同样能实现参数传递的效果。
首先导入partial:
from functools import partial
然后修改按钮创建代码:
# 创建Restart按钮,绑定索引i buttons[i] = tk.Button(fr4, text="Restart", command=partial(restart, i), pady=13) # 创建Delete按钮,绑定索引i+1 buttons[i+1] = tk.Button(fr5, text="Delete", command=partial(delete, i+1), pady=13)
回调函数的写法和lambda方法一致,需要接收索引参数:
def restart(idx): # 通过buttons[idx]操作对应按钮 pass def delete(idx): # 通过buttons[idx]操作对应按钮 pass
额外小提醒
你当前的代码里buttons是初始化为空数组,然后直接用buttons[i] = ...赋值,要注意数组长度不足会触发索引越界错误。更稳妥的方式是改用buttons.append(...)来添加按钮,这样不用手动管理数组长度,代码也更简洁。
内容的提问来源于stack exchange,提问作者Kinuhatek
相关产品推荐
相关产品推荐

