tkinter-如何获取哪个菜单项引起了回调?

时间:2018-09-08 21:56:46

标签: python tkinter menu callback

我希望菜单有一个回调函数。为了确定在回调中采取什么动作,我需要知道哪个菜单项生成了回调。我一直无法弄清楚。

我在add调用中看到一个名为“变量”的选项,但是当我尝试使用它时出现错误。我以为也许可以允许我指定一个StringVar,菜单文本将存储在其中。

想在hello函数中知道谁生成了回调。是否可以指定一个可以传递的参数?

from tkinter import *

root = Tk()

def hello():
    print ("hello!")

# create a toplevel menu
menubar = Menu(root)
menubar.add_command(label="Hello!", command=hello)
menubar.add_command(label="Quit!", command=hello)

# display the menu
root.config(menu=menubar)

mainloop()

3 个答案:

答案 0 :(得分:1)

首先,避免星星进口。您可以将其导入其他名称以使其不那么典型。

import tkinter as tk
菜单上的

command不返回任何内容。您可以使用lambda或进行单独的功能。


使用lambda

root = tk.Tk()

# create a toplevel menu
menubar = tk.Menu(root)
menubar.add_command(label="Hello!", command=lambda:print("Hello!"))
menubar.add_command(label="Quit!", command=lambda:print("hello!"))

# display the menu
root.config(menu=menubar)

root.mainloop()

当您按下Hello!菜单时,它将打印Hello!,但是当您按下Quit!时它将打印hello!


使用单独的功能:

root = tk.Tk()
def hello():   #Hello! menu
    print("hello!")
def Hello():   #Quit! menu
    print("Hello!")
# create a toplevel menu
menubar = tk.Menu(root)
menubar.add_command(label="Hello!", command=hello)
menubar.add_command(label="Quit!", command=Hello)

# display the menu
root.config(menu=menubar)

root.mainloop()

您可以创建单独的函数来标识菜单回调。

具有3个功能:

您可以进行3种功能。其中一个将是您要在其他两个函数中调用的主要对象。识别菜单将为您带来好处。这是一个示例:

root = tk.Tk()
def _main():
    print("hello!")
def hello():   #Hello! menu
    _main()
def Hello():   #Quit! menu
    _main()

# create a toplevel menu
menubar = tk.Menu(root)
menubar.add_command(label="Hello!", command=hello)
menubar.add_command(label="Quit!", command=Hello)

# display the menu
root.config(menu=menubar)

root.mainloop()

答案 1 :(得分:0)

发布的问题是:

  

想在hello函数中知道谁生成了回调。   是否可以指定一个可以传递的参数?

经过一些研究,我发现我的函数如何知道谁调用它。代码比我预期的要复杂。

我使用的代码行是:

    top_menu.add_command(label=sub_menu_info, command=lambda: Menu.MenuItemChosenCallback(element, sub_menu_info))

我之前没有使用过lambda,所以他们的语法让我失望。我的“菜单”类中有一个名为MeduItemChosenCallback的方法。声明为:

def MenuItemChosenCallback(self,item_chosen):

我没有意识到我需要将类名放在lambda的函数中。我以为会是element.MenuItemChosenCallback,因为那是一个Menu对象。同样,在需要使用语法之前,请不要使用lambda。

使用原始发布的示例代码,通过以下参数确定调用hello的人员:

from tkinter import *

root = Tk()

def hello(parm):
    print (parm)

# create a toplevel menu
menubar = Menu(root)
menubar.add_command(label="Hello!", command= lambda: hello('1'))
menubar.add_command(label="Quit!", command=lambda: hello('2'))


# display the menu
root.config(menu=menubar)

mainloop()

答案 2 :(得分:0)

可以说,最好的解决方案是让每个命令调用一个不同的函数。

menubar.add_command(label="Hello!", command=menu_hello)
menubar.add_command(label="Quit!", command=menu_quit)

如果您需要多个菜单项来调用同一命令,通常使用lambdafunctools.partial

示例:

menubar.add_command(label="Hello!", command=lambda: hello("1"))
menubar.add_command(label="Quit!", command=lambda: hello("2"))