如何在Tkinter类Excel表格中实现类似Active.cell的行号获取
获取Tkinter激活Entry的行号实现重计算
要实现修改Entry后重计算,核心是追踪当前激活的Entry控件并获取其行号,用grid_info()就能做到,具体步骤如下:
1. 调整代码,保存Entry控件对象
原来的代码只存了StringVar,现在要把Entry控件本身存起来,因为grid_info()是控件的方法:
entriesPI1 = [] # 改为存储Entry控件,而非StringVar for i in range(5,20): varlayer1pi = tk.StringVar() b = tk.Entry(newtab1, textvariable=varlayer1pi, background='#87CEEB') b.grid(row=i, column=6, sticky='NSEW') # 绑定焦点事件,追踪激活的Entry b.bind("<FocusIn>", on_entry_focus) entriesPI1.append(b) # 保存控件实例
2. 追踪当前激活的Entry
定义一个全局变量存储当前获得焦点的Entry,通过<FocusIn>事件更新:
current_active_entry = None def on_entry_focus(event): global current_active_entry current_active_entry = event.widget # 拿到触发事件的Entry控件
3. 重计算时获取行号并执行逻辑
在重计算函数里,通过grid_info()提取行号,然后编写你的计算逻辑:
def recalculate(): global current_active_entry if not current_active_entry: return # 没有激活的Entry就不执行 # 从grid_info()里取行号 row_num = current_active_entry.grid_info()['row'] # 这里写你的重计算逻辑,比如: current_value = current_active_entry.get() print(f"修改的行号:{row_num},当前值:{current_value}") # 示例:更新该行或其他行的计算结果 # entriesPI1[row_num - 5].set(str(float(current_value)*2)) # 假设行号从5开始,对应列表索引0
4. 触发重计算的方式
可以给Entry绑定回车键,按下就触发计算:
在生成Entry的循环里加一行:
b.bind("<Return>", lambda e: recalculate())
或者加一个按钮手动触发:
calc_btn = tk.Button(newtab1, text="重计算", command=recalculate) calc_btn.grid(row=20, column=6, sticky='NSEW')
关键点说明:
- 必须操作Entry控件实例,
StringVar没有grid_info()方法 <FocusIn>事件会在Entry获得焦点时触发,相当于VB里的ActiveCellgrid_info()返回的字典中,'row'对应控件所在的行号
内容的提问来源于stack exchange,提问作者Orlando
相关产品推荐
相关产品推荐

