2

我正在开发一个 gui,我在其中创建了一个带有几个选项的右键单击弹出菜单。现在我的查询是如何将一些变量或值或参数或字符串传递给包含在弹出菜单中的命令。我使用下面的代码来生成弹出菜单。

from Tkinter import *

root = Tk()

w = Label(root, text="Right-click to display menu", width=40, height=20)
w.pack()

# create a menu
popup = Menu(root, tearoff=0)
popup.add_command(label="Next", command=next(a,b))
popup.add_command(label="Previous")
popup.add_separator()
popup.add_command(label="Home")

def do_popup(event,a,b):
    # display the popup menu
    try:
        popup.tk_popup(event.x_root, event.y_root)
    finally:
        # make sure to release the grab (Tk 8.0a1 only)
        popup.grab_release()
def next(event,a,b):
    print a
    print b

w.bind("<Button-3>",lambda e, a=1, b=2: do_popup(e,a,b))

b = Button(root, text="Quit", command=root.destroy)
b.pack()

mainloop()

在上面的代码中,我想将 a 和 b 的值传递给 Next 命令。怎么做。

谢谢。

4

2 回答 2

3

您需要存储这些值以便在next事件处理程序中使用它们。您可以做一些解决方法,例如在 Menu 对象中添加引用popup.values = (a, b),但最简洁的方法是使用类来表示您的 GUI。

请注意,它就像继承 Tkinter 小部件并添加您要存储的值一样简单:

from Tkinter import *

class App(Tk):
    def __init__(self):
        Tk.__init__(self)
        self.a = 1
        self.b = 2
        self.label = Label(self, text="Right-click to display menu", width=40, height=20)
        self.button = Button(self, text="Quit", command=self.destroy)
        self.label.bind("<Button-3>", self.do_popup)
        self.label.pack()
        self.button.pack()
    def do_popup(self, event):
        popup = Popup(self, self.a, self.b)
        try:
            popup.tk_popup(event.x_root, event.y_root)
        finally:
            popup.grab_release()

class Popup(Menu):
    def __init__(self, master, a, b):
        Menu.__init__(self, master, tearoff=0)
        self.a = a
        self.b = b
        self.add_command(label="Next", command=self.next)
        self.add_command(label="Previous")
        self.add_separator()
        self.add_command(label="Home")
    def next(self):
        print self.a, self.b

app = App()
app.mainloop()
于 2013-03-17T18:40:14.577 回答
2

@一种。Rodas 的回答很好,但这里有一个解决方案,它不需要为每次激活创建一个新的菜单实例(而是一个在需要时反复使用的菜单实例):

from tkinter import *

class App(Tk):
    def __init__(self):
        Tk.__init__(self)
        self.a = 1
        self.b = 2
        self.menu = Popup(self)
        self.label = Label(self, text="Right-click to display menu",
                           width=40, height=20)
        self.button = Button(self, text="Quit", command=self.destroy)
        self.label.bind("<Button-3>",
                        lambda e: self.menu.popup(e.x_root, e.y_root,
                                                  self.a, self.b))
        self.label.pack()
        self.button.pack()

class Popup(Menu):
    def __init__(self, master):
        super().__init__(master, tearoff=0)
        self.a = None
        self.b = None
        self.add_command(label="Do something", command=self.act)
    def act(self):
        print(self.a, self.b)
    def popup(self, x, y, a, b):
        self.a = a
        self.b = b
        self.tk_popup(x, y)

app = App()
app.mainloop()

注意我们是如何在调用菜单时传递参数的,而不是在实例化它时。

于 2015-08-14T09:09:50.113 回答