【问题标题】:Custom Python Tk menu自定义 Python Tk 菜单
【发布时间】:2017-02-21 22:36:06
【问题描述】:

当我尝试在 add_command 构造函数中分配一个带有参数的函数时,该函数会在菜单启动时执行。

所以我的问题是:有没有办法取消“每个菜单项一个功能”?就像在一个完整的菜单中一样,它会增加一个大修。

#!/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()

【问题讨论】:

  • 在此处发布您的代码的最小示例。

标签: python tkinter menu tk


【解决方案1】:

当我尝试在 add_command 构造函数中分配一个带有参数的函数时,该函数会在菜单启动时执行。

当你添加一个命令时,你必须给它一个callable。如果您想传递参数,您可以使用lambdafunctools.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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多