问题描述
我想要一个右键菜单,让我可以选择删除我点击的任何按钮
我已经在另一个函数中为列表中的 i 按钮使用 command=lambda smth=i: func(smth)
有没有办法通过右键菜单来做到这一点?
这是我的代码:
from tkinter import *
root = Tk()
L = Label(root,text="Right-click to display menu",width=40,height=20)
L.pack()
smth = [1,2,3,4,5]
def func(smth):
print(smth)
m = Menu(root,tearoff=0)
m.add_command(label="Delete")
for i in smth:
m.config(command=lambda x: func(smth=i))
def do_popup(event):
try:
m.tk_popup(event.x_root,event.y_root)
finally:
m.grab_release()
L.bind("<Button-3>",do_popup)
mainloop()
如果我把 m.add_command(label='Delete')
在 for 循环中,它将在右键菜单中创建多个实例,这是我不想要的
有什么想法吗? 提前致谢。
解决方法
我使用一个全局变量来完成此操作,该变量保存与右键单击的按钮相关的参数(在本例中为数字)。然后在 delete
函数中访问它。我没有找到一种内置的方法来做到这一点。
import tkinter as tk
root = tk.Tk()
buttonRightClicked = None
def delete():
global buttonRightClicked
print(buttonRightClicked)
menu = tk.Menu(root,tearoff = 0)
menu.add_command(label = "Delete",command = delete)
def do_popup(event,x):
global buttonRightClicked
buttonRightClicked = x
try:
menu.tk_popup(event.x_root,event.y_root)
finally:
menu.grab_release()
for x in range(6):
b = tk.Button(root,text = f"Button number {x}")
b.grid(row = 0,column = x)
b.bind("<Button-3>",lambda event,i = x: do_popup(event,i))
root.mainloop()