Как привязать событие правого клика внутри объекта Class на основе фрейма - PullRequest
0 голосов
/ 08 января 2020

Я работаю над классом, который поддерживает кнопку с несколькими шрифтами, встраивая несколько виджетов в рамку. Теперь я пытаюсь обработать экземпляр класса, вызывая метод bind(), но не могу заставить его работать. Я думал, что класс просто унаследует метод bind() от фрейма, но, похоже, в этом случае он не работает. Когда я щелкаю правой кнопкой мыши по второй кнопке (экземпляр класса), я не получаю свое печатное утверждение. Что я делаю неправильно? Образец для воспроизведения вопроса:

import tkinter as tk

class ButtonF(tk.Frame):

    def __init__(self, master=None, **options):
        self.command = options.pop('command', None)
        text = options.pop('text', '')
        tk.Frame.__init__(self, master, **options)
        self.b = tk.Button(master, text=text, command=self.command)
        self.bind('<Button-1>', self._click)
        self.bind('<ButtonRelease-1>', self._release)
        self.b.pack()

    def _click(self):
        self.config(relief=tk.SUNKEN)
        if self.command:
            self.command()

    def _release(self):
        self.config(relief=tk.RAISED)

    def bind(self, *a, **kw):
        tk.Frame.bind(self, *a, **kw)

if __name__ == '__main__':
    root = tk.Tk()
    root.title('Frame Button')
    root.but1 = tk.Button(root, text='Button 1 (Regular)', command=lambda *a:print('Button 1 Click!'))
    root.but1.pack(side=tk.LEFT)
    root.but2 = ButtonF(root, text='Button 2 (ButtonF)', command=lambda *a:print('Button 2 Click!')) # 
    root.but2.pack(side=tk.LEFT)
    root.but1.bind('<Button-3>', lambda *a: print('Button 1 Right-Click!'))
    root.but2.bind('<Button-3>', lambda *a: print('Button 2 Right-Click!')) #### THIS DOESN'T WORK ####
    root.mainloop()

Ответы [ 2 ]

0 голосов
/ 16 февраля 2020

Последний трюк заключался в привязке как к рамке, так и к кнопке. Таким образом, привязка к self и self.b. Почему? Ну, вы должны привязать к фрейму в случае, если вы нажмете на часть фрейма, которая не находится под кнопкой. И вы должны привязать к кнопке в случае, если вы нажмете на саму кнопку (то есть не на части кадра). Итак, для правильного решения необходимы две привязки.

0 голосов
/ 08 января 2020

Ваш ButtonF наследуется от tk.Frame. Когда вы делаете:

root.but2.bind('<Button-3>', lambda *a: print('Button 2 Right-Click!'))

Вы привязываетесь к кадру, а не к кнопке внутри рамки (для которой мастер установлен на root).

Чтобы получить ожидаемое поведение , необходимо передать привязку к кнопке:

def bind(self, *a, **kw):
    tk.Frame.bind(self.b, *a, **kw)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...