如何在tksheet/tkinter中手动触发end_edit_cell事件?
如何在tksheet/tkinter中手动触发end_edit_cell事件?
这个问题我之前也碰到过!确实挺头疼的——用户正在编辑单元格时直接点自定义按钮,tksheet没来得及把编辑内容同步到内部数据模型,也没触发end_edit_cell事件,导致刚输入的数据直接丢了。不过有个很稳妥的解决办法,分两步走就能搞定:
首先得强制结束当前的单元格编辑状态,把用户输入的内容保存到tksheet的内部数据里;然后再手动触发你的数据更新逻辑(要么直接调用update_sheet0_data函数,要么触发end_edit_cell事件)。
具体实现步骤
检查并结束当前编辑
tksheet的Sheet对象自带editing_cell属性,能判断是否有单元格正在被编辑;还有end_edit()方法,可强制结束编辑并把输入内容保存到sheet的内部数据中。触发数据更新
结束编辑后,你可以直接调用自己的update_sheet0_data函数(如果函数不需要用到event参数,传None就行),或者用event_generate触发end_edit_cell对应的内部事件。
结合你的代码修改示例
把自定义按钮的回调函数改成这样就可以了:
class my_window(tk.Tk): def __init__(self): super().__init__() # 初始化你的sheet self.sheet0 = Sheet(self) self.sheet0.extra_bindings("end_edit_cell", self.update_sheet0_data) # 假设你的自定义按钮是这样的 self.custom_btn = tk.Button(self, text="修改sheet数据", command=self.on_custom_btn_click) self.custom_btn.pack() self.sheet0.pack() def update_sheet0_data(self, event): # 这里写你更新pandas表的逻辑 # 比如从sheet获取最新数据 sheet_data = self.sheet0.get_sheet_data() # 更新pandas DataFrame # self.df = pd.DataFrame(sheet_data) print("已同步最新单元格数据到DataFrame") def on_custom_btn_click(self): # 第一步:处理正在编辑的单元格 if self.sheet0.editing_cell: # 强制结束编辑,保存内容到sheet self.sheet0.end_edit() # 手动触发数据更新 self.update_sheet0_data(None) # 第二步:执行按钮原本的逻辑(比如修改sheet数据) # 举个例子:修改第2行第3列的数据(索引从0开始) self.sheet0.set_cell_data(1, 2, "按钮修改的新数据") app = my_window() app.mainloop()
补充说明
- 如果你的
update_sheet0_data需要用到event里的行、列信息,可以用self.sheet0.get_currently_editing()获取当前编辑的单元格位置,再把这些参数传给更新函数。 - 如果你想严格触发
end_edit_cell事件而不是直接调用函数,可以用self.sheet0.event_generate("<<SheetEndEditCell>>"),不过一定要先调用end_edit(),否则事件里的数据还是旧的。
这样处理后,用户点击按钮时,刚输入的单元格内容会先被保存到sheet里,再同步到你的pandas表,就不会再丢失数据啦!
备注:内容来源于stack exchange,提问作者Flx
相关产品推荐
相关产品推荐

