如何将Tkinter中<Enter>绑定事件的触发条件限制在窗口指定区域?
实现方案
当然可以,以下是两种最常用的实现方式:
方案1:使用占位Frame作为指定触发区域(推荐)
这个方案逻辑最简单,直接创建一个固定位置、固定大小的Frame组件作为触发区域,仅将<Enter>和<Leave>事件绑定到这个Frame上即可:
from tkinter import Tk, Frame, Label class Right(Frame): def __init__(self, master, *args, **kwargs): Frame.__init__(self, master, *args, **kwargs) self.pack(fill="both", expand=True) # 定义触发区域:位置x=50, y=50,宽200,高150 self.trigger_area = Frame(self, width=200, height=150, bg=self["bg"], borderwidth=0) self.trigger_area.place(x=50, y=50) # 仅给触发区域绑定事件 self.trigger_area.bind('<Enter>', self.mouse) self.trigger_area.bind('<Leave>', self.inmouse) self.lbl_77 = Label(self, text='hello', bg='green', fg='black') def mouse(self, event): # 过滤子控件触发的事件(如果触发区域内有其他控件可加这个判断) if event.widget == self.trigger_area: self.lbl_77.place(x=90, y=0) def inmouse(self, event): if event.widget == self.trigger_area: self.lbl_77.place_forget() root = Tk() root.geometry("400x300") frame = Right(root) root.mainloop()
如果你想要能直观看到触发区域的位置,把self.trigger_area的bg参数改成其他颜色即可,调试完成后再改回和父容器一致的背景色。
方案2:全局监听鼠标移动,手动判断坐标范围
如果你不想额外添加Frame组件,也可以绑定全局的<Motion>事件,每次鼠标移动时判断当前坐标是否落在你指定的区域内:
from tkinter import Tk, Frame, Label class Right(Frame): def __init__(self, master, *args, **kwargs): Frame.__init__(self, master, *args, **kwargs) self.pack(fill="both", expand=True) # 绑定全局鼠标移动事件 self.master.bind('<Motion>', self.check_mouse_pos) # 定义触发区域的范围:x1到x2,y1到y2 self.area_x1, self.area_y1 = 50, 50 self.area_x2, self.area_y2 = 250, 200 self.lbl_77 = Label(self, text='hello', bg='green', fg='black') self.label_showing = False def check_mouse_pos(self, event): # 判断当前鼠标坐标是否在指定区域内 in_area = (self.area_x1 <= event.x <= self.area_x2) and (self.area_y1 <= event.y <= self.area_y2) if in_area and not self.label_showing: self.lbl_77.place(x=90, y=0) self.label_showing = True elif not in_area and self.label_showing: self.lbl_77.place_forget() self.label_showing = False root = Tk() root.geometry("400x300") frame = Right(root) root.mainloop()
内容的提问来源于stack exchange,提问作者user16735465
相关产品推荐
相关产品推荐

