#python #tkinter
Вопрос:
Как я могу избавиться от странного поведения self.frame_control
, когда я навожу курсор мыши на границу этого виджета, я получаю раздражающее мерцание, которое я не понимаю, почему это происходит? Большое спасибо.
Минимальный воспроизводимый пример:
from tkinter import * class Interface(Frame): def __init__(self, master, *args, **kwargs): super().__init__(master, *args, **kwargs) self._motion_1 = False self.x1 = 0 self.x2 = 100 self.y1 = 0 self.y2 = 50 self.control = Frame(self, bg='green') self.control .pack(fill= 'both', expand= True) self.lbl_change1 = Label(self.control, text='text 1', bg='black', fg='white', bd=0) self.lbl_change1 .pack(side=LEFT, fill='both', expand=True, padx=10) self.lbl_change2 = Label(self.control, text='text 2', bg='black', fg='white', bd=0) self.lbl_change2 .pack(side=LEFT, fill='both', expand=True, padx=10) #_______________ self.master.bind('lt;Motiongt;',self.open_frame) self.master.bind('lt;Leavegt;', lambda arg: self.control .pack_forget()) def open_frame(self, event): self.pointer_width_2 = event.x / self.master.winfo_width() * 100 self.pointer_height_2 = event.y / self.master.winfo_height() * 100 if not self._motion_1 == True: if self.x1 lt;(self.pointer_width_2)lt; self.x2 and self.y1 lt;(self.pointer_height_2)lt; self.y2: self.control .pack(fill= 'both', expand= True) print('if') else: print('else') self.control .pack_forget() root = Tk() root .geometry('200x600 300 0') root .config(bg='gray22') frame = Interface(root) frame .pack() root .mainloop()
Комментарии:
1. что ты хочешь, чтобы произошло? каково ожидаемое поведение?
2. существует
'lt;Entergt;'
событие, противоположное'lt;Leavegt;'
этому, поэтому вы можете использовать это3. @Matiiss Проблема в
Enter
том, что я не могу выбрать определенную часть окна, чтобы скрыть и отобразить виджет, только если мышь расположена над этой областью, должны быть выполнены эти инструкции,x1, x2, y1, y2
извините, я не знаю, правильно ли я выразился, я не знаю, правильно ли я использую термины. Что я пытаюсь сделать, так это показать виджет, если мышь находится над верхней половиной окна, и скрыть его, если он покидает эту половину или окно.4. вы хотите ограничить доступ к определенной области или определенному виджету?
5. Вам нужно проверить, какой виджет запускает обратные вызовы событий. Я думаю, что вам нужно выполнить задачу только тогда, когда это событие инициируется
root
окном.