微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。