如何在Python Tkinter中解绑事件绑定?新手技术求助
解决tkinter事件解绑问题
首先,tkinter里解绑事件用unbind()方法,有两种常用用法:
- 解绑某个事件的所有绑定:直接调用
窗口对象.unbind("<事件名>") - 解绑特定的绑定函数:绑定的时候先保存返回ID(
bind_id = 窗口对象.bind("<事件名>", 函数)),解绑时用窗口对象.unbind("<事件名>", bind_id)
以下针对你的需求给出两种具体实现:
需求1:点击左键获取一次坐标后,解绑左键点击事件
这种实现下,你只能点击一次获取坐标,之后再点击窗口不会有反应:
from tkinter import * GroesseX=200 GroesseY=200 Fenster=Tk() xE=Entry(Fenster) class Cor(): def find_cor(self, event): global x,y x, y = event.x, event.y print('x={}, y={}'.format(x, y)) self.show_cor() # 获取坐标后立即解绑左键点击事件 Fenster.unbind("<Button-1>") def show_cor(self): print("show_cor called") Fenster.geometry(f'{GroesseX+200}x{GroesseY}') xE.pack() xE.delete(0,END) xE.insert(0,f"x={x}, y={y}") cor=Cor() # 绑定左键点击事件 Fenster.bind("<Button-1>", cor.find_cor) # 启动窗口主循环(原代码缺失,必须加上否则窗口会一闪而过) Fenster.mainloop()
需求2:点击左键开启鼠标实时追踪,再次点击关闭追踪
这种实现支持切换状态,点击一次开启鼠标移动时的坐标显示,再点击一次停止:
from tkinter import * GroesseX=200 GroesseY=200 Fenster=Tk() xE=Entry(Fenster) # 保存鼠标移动事件的绑定ID,方便后续精准解绑 motion_bind_id = None class Cor(): def track_cor(self, event): global x,y x, y = event.x, event.y print('x={}, y={}'.format(x, y)) self.show_cor() def show_cor(self): Fenster.geometry(f'{GroesseX+200}x{GroesseY}') xE.pack() xE.delete(0,END) xE.insert(0,f"x={x}, y={y}") cor=Cor() def click_handler(event): global motion_bind_id if motion_bind_id is None: # 未绑定状态,开启追踪 motion_bind_id = Fenster.bind("<Motion>", cor.track_cor) print("开始追踪鼠标坐标") else: # 已绑定状态,解绑停止追踪 Fenster.unbind("<Motion>", motion_bind_id) motion_bind_id = None print("停止追踪鼠标坐标") # 绑定左键点击来切换追踪状态 Fenster.bind("<Button-1>", click_handler) Fenster.mainloop()
关键说明
unbind()是tkinter控件的内置方法,专门用于移除之前绑定的事件处理逻辑- 保存绑定ID的好处是,不会误删同一事件的其他绑定逻辑;如果不需要区分,直接调用
unbind("<事件名>")就能清空该事件的所有绑定 - 窗口必须通过
mainloop()启动,否则无法正常显示和响应事件
内容的提问来源于stack exchange,提问作者lt2020
相关产品推荐
相关产品推荐

