有什么方法可以为同一个右键菜单在循环中设置不同的命令?

问题描述

我想要一个右键菜单,让我可以选择删除我点击的任何按钮 我已经在另一个函数中为列表中的 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()