Как получить "<Enter>" события для перекрывающихся фреймов? - PullRequest
1 голос
/ 28 октября 2019

У меня несколько сложный пользовательский интерфейс, созданный с помощью Tkinter / ttk, который содержит несколько кадров, включенных в другие кадры.

Я хочу, чтобы событие <Enter> сработало, когда я перешел от внутреннего кадра к родительскому. .

Я уже связываюсь с событием <Leave> для других функций, но как мне получить «текущий» виджет, чтобы я мог вызвать «поддельное» событие <Enter> на родительском виджете? Но это только если оставить ребенка родителю, а не оставить ребенка и родителя одновременно (например, на границе).

Вот пример кода, иллюстрирующий то, что я имею в виду:

#!/usr/bin/python3
import tkinter
from tkinter import ttk


def onEnter(event):
    print('Widget: %s', event.widget)


class FrameTop(ttk.LabelFrame):
    def __init__(self, master, *args, **kwargs):
        super().__init__(master, *args, text='TopFrame', **kwargs)

        for i in range(4):
            lbl_t = ttk.Label(self, text='Top Label %d' % i)
            lbl_t.pack()
        self.bottom = FrameBottom(self, 1)
        self.bottom.pack()
        self.lbl = ttk.Label(self.bottom, text='Label')
        self.lbl.pack()


class FrameBottom(ttk.LabelFrame):
    def __init__(self, master, num, *args, **kwargs):
        super().__init__(master, *args, text='BottomFrame %d' % num, **kwargs)
        for i in range(5):
            lbl_t = ttk.Label(self, text='#%d: Label %d' % (num, i))
            lbl_t.pack()
        if num < 5:
            inner = FrameBottom(self, num + 1)
            inner.pack()
        self.bind('<Enter>', onEnter, add=True)  # Bind Bottom


root = tkinter.Tk()

tp = FrameTop(root)
tp.pack()

tp.bind('<Enter>', onEnter, add=True)  # Bind Bottom

root.mainloop()

1 Ответ

0 голосов
/ 29 октября 2019

Вы оборачиваете фреймы внутри фреймов, поэтому я думаю, что проще выбрать связывание с <Motion> вместо:

import tkinter
from tkinter import ttk

class FrameTop(ttk.LabelFrame):
    def __init__(self, master, *args, **kwargs):
        super().__init__(master, *args, text='TopFrame', **kwargs)

        for i in range(4):
            lbl_t = ttk.Label(self, text='Top Label %d' % i)
            lbl_t.pack()
        self.bottom = FrameBottom(self, 1)
        self.bottom.pack()
        self.lbl = ttk.Label(self.bottom, text='Label')
        self.lbl.pack()


class FrameBottom(ttk.LabelFrame):
    def __init__(self, master, num, *args, **kwargs):
        super().__init__(master, *args, text='BottomFrame %d' % num, **kwargs)
        for i in range(5):
            lbl_t = ttk.Label(self, text='#%d: Label %d' % (num, i))
            lbl_t.pack()
        if num < 5:
            inner = FrameBottom(self, num + 1)
            inner.pack()

root = tkinter.Tk()

tp = FrameTop(root)
tp.pack()

current = None

def movement(event=None):
    global current
    if current !=event.widget and isinstance(event.widget,ttk.LabelFrame):
        current = event.widget
        print (current)

root.bind('<Motion>',movement)
root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...