Python/tkinter: привязка правой кнопки мыши к массиву виджетов

enter code hereЯ отображаю массив кнопок на экране и хочу реализовать функцию щелчка правой кнопкой мыши. Я щелкнул левой кнопкой мыши, работая с опцией «command=» по умолчанию в виджете, но по какой-то причине я не могу заставить кнопку привязываться к срабатыванию. Мой код выглядит так:

      for key, value in sorted_widget_properties:
    if key not in self._filter_list:
        continue
    colour = value[appearance_mode_index]
    if row > 18:
        offset = 4
        row = 1

    # Light mode colours
    if row == 1:
        pad_y = (10, 0)
    else:
        pad_y = 5
    lbl_property = ctk.CTkLabel(master=widget_frame, text=' ' + key)
    lbl_property.grid(row=row, column=1 + offset, sticky='w', pady=pad_y)
    btn_property = ctk.CTkButton(master=widget_frame,
                                 border_width=1,
                                 fg_color=colour,
                                 width=button_width,
                                 height=button_height,
                                 text='',
                                 command=lambda widget_property=key: self.colour_picker(widget_property),
                                 corner_radius=3)
    btn_property.grid(row=row, column=0 + offset, padx=5, pady=pad_y)
    self.widgets[key] = {"widget": btn_property, "button": btn_property, "colour": colour,
                         'label': lbl_property}
    # Set a binding so that we can paste a colour, previously copied into our clipboard
    self.widgets[key]['widget'].bind("<Button-3>",
                                     lambda widget_property=key: self._paste_colour(widget_property))
    row += 1

У меня есть оператор печати в методе класса _paste_colour, и кажется, что функция никогда не вызывается и ничего не печатается:

      def _paste_colour(self, widget_property):
    print('PASTE COLOUR!"')
    new_colour = pyperclip.paste()
    if len(new_colour) != 7:
        self._status_bar.set_status_text(status_text='Attempt to paste a bad colour code - ignored.')
    self._set_widget_colour(widget_property=widget_property, new_colour=new_colour)
    self._status_bar.set_status_text(
        status_text=f'Colour {new_colour} assigned to widget property {widget_property}.')

Любые предложения приветствуются.

Спасибо,

Клайв

2 ответа

В следующий раз, пожалуйста, приведите минимальный воспроизводимый пример. У вас есть много переменных, которые не определены в коде, который вы показываете, и класс tkinter также не предоставляется. Также мы не знаем, получаете ли вы какие-либо сообщения об ошибках. Это затрудняет устранение неполадок. Возможно, вам просто не хватаетeventпараметр, но не уверен, правильно ли я понимаю вашу проблему.

      import tkinter as tk

root = tk.Tk()
root.geometry("200x200")
widget_frame = tk.Frame(root).grid(row=1, column=1)


def right_click(x):
    print('right clicked')
    print(x)

def left_click():
    print('left clicked')


lbl_property = tk.Label(master=widget_frame, text='Label')
lbl_property.grid(row=0, column=0, sticky='w')
btn_property = tk.Button(master=widget_frame,
                             text='button',
                             command=left_click
                             )
btn_property.grid(row=0, column=1, padx=5, pady=5)
param='some parameter'
btn_property.bind("<Button-3>", lambda event, x=param: right_click(x))

root.mainloop()

Хорошо, извиняюсь, я действительно должен был немного больше подготовиться.

В любом случае, взяв приведенный выше пример и заменив его наcustomtkinterвиджет. Я воспроизвел проблему:

      import tkinter as tk
import customtkinter as ctk

root = tk.Tk()
root.geometry("200x200")
widget_frame = tk.Frame(root).grid(row=1, column=1)


def right_click(x):
    print('right clicked')
    print(x)

def left_click():
    print('left clicked')


lbl_property = tk.Label(master=widget_frame, text='Label')
lbl_property.grid(row=0, column=0, sticky='w')
btn_property = ctk.CTkButton(master=widget_frame,
                             text='button',
                             command=left_click
                             )
btn_property.grid(row=0, column=1, padx=5, pady=5)
param='some parameter'
btn_property.bind("<Button-3>", lambda event, x=param: right_click(x))

root.mainloop()

Запустив приведенное выше, маскирует привязку правого клика. Ошибок нет, просто не работает.

Я подниму вопрос на GitHub на форуме customtkinter.

Другие вопросы по тегам