我希望菜单有一个回调函数。为了确定在回调中采取什么动作,我需要知道哪个菜单项生成了回调。我一直无法弄清楚。
我在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()
答案 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种功能。其中一个将是您要在其他两个函数中调用的主要对象。识别菜单将为您带来好处。这是一个示例:
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)
如果您需要多个菜单项来调用同一命令,通常使用lambda
或functools.partial:
示例:
menubar.add_command(label="Hello!", command=lambda: hello("1"))
menubar.add_command(label="Quit!", command=lambda: hello("2"))