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.