自定义 Python Tk 菜单
Custom Python Tk menu
当我尝试用 add_command 构造函数中的参数分配函数时,该函数在菜单启动时执行。
所以我的问题是:有什么办法可以松开 "one function per menu item" 吗?就像在一个完整的菜单中一样,这将增加一个大修。
#!/usr/bin/python2.7
import os
from Tkinter import *
def runCommand(app):
os.system(app + " &")
def runBrowser():
app = "firefox"
runCommand(app)
def runTerminal():
app = "terminology"
runCommand(app)
def runFileManager():
app = "xfe"
runCommand(app)
def runEditor():
app = "atom"
runCommand(app)
root = Tk()
root.title("Root Menu")
menubar=Menu(root)
appsmenu=Menu(menubar)
menubar.add_cascade(label="Root Menu", menu=appsmenu)
appsmenu.add_command(label="Terminal", command=runTerminal)
appsmenu.add_command(label="Editor", command=runEditor)
appsmenu.add_command(label="File Manager", command=runFileManager)
appsmenu.add_command(label="Browser", command=runBrowser)
appsmenu.add_separator()
appsmenu.add_command(label="Close Menu", command=root.quit)
root.config(menu=menubar)
root.mainloop()
When I try to assign a function with an argument in add_command constructor that function gets executed on menu launch.
添加命令时,必须给它一个可调用。如果你想传递参数,你可以通过使用 lambda or functools.partial.
创建一个可调用对象来实现
例如,如果您想要一个可以向 运行 发出命令的函数,您可以这样做:
def run_command(command):
print "running...", command
appsmenu.add_command(label="Terminal", command=lambda: run_command("Terminal"))
如果要在列表中创建菜单项,可以通过将变量值作为默认参数提供给 lambda
:
来绑定变量值
for label, cmd in (("Browser", "firefox"),
("File Manager", "xfe"),
("Editor", "atom")):
appsmenu.add_command(label=label,
command=lambda command=cmd: run_command(command))
当我尝试用 add_command 构造函数中的参数分配函数时,该函数在菜单启动时执行。
所以我的问题是:有什么办法可以松开 "one function per menu item" 吗?就像在一个完整的菜单中一样,这将增加一个大修。
#!/usr/bin/python2.7
import os
from Tkinter import *
def runCommand(app):
os.system(app + " &")
def runBrowser():
app = "firefox"
runCommand(app)
def runTerminal():
app = "terminology"
runCommand(app)
def runFileManager():
app = "xfe"
runCommand(app)
def runEditor():
app = "atom"
runCommand(app)
root = Tk()
root.title("Root Menu")
menubar=Menu(root)
appsmenu=Menu(menubar)
menubar.add_cascade(label="Root Menu", menu=appsmenu)
appsmenu.add_command(label="Terminal", command=runTerminal)
appsmenu.add_command(label="Editor", command=runEditor)
appsmenu.add_command(label="File Manager", command=runFileManager)
appsmenu.add_command(label="Browser", command=runBrowser)
appsmenu.add_separator()
appsmenu.add_command(label="Close Menu", command=root.quit)
root.config(menu=menubar)
root.mainloop()
When I try to assign a function with an argument in add_command constructor that function gets executed on menu launch.
添加命令时,必须给它一个可调用。如果你想传递参数,你可以通过使用 lambda or functools.partial.
创建一个可调用对象来实现例如,如果您想要一个可以向 运行 发出命令的函数,您可以这样做:
def run_command(command):
print "running...", command
appsmenu.add_command(label="Terminal", command=lambda: run_command("Terminal"))
如果要在列表中创建菜单项,可以通过将变量值作为默认参数提供给 lambda
:
for label, cmd in (("Browser", "firefox"),
("File Manager", "xfe"),
("Editor", "atom")):
appsmenu.add_command(label=label,
command=lambda command=cmd: run_command(command))