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_color类方法中有一个print语句,它似乎从未调用过该函数,也从未打印过任何内容:

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}.')

欢迎提出任何建议。

谢谢,

Clive

下次请提供一个可重复的最小示例。您有很多变量没有在显示的代码中定义,也没有提供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上的customerinter论坛上提出这个问题。