2017-02-21 10 views
-1

Когда я пытаюсь назначить функцию с аргументом в конструкторе add_command, эта функция запускается при запуске меню.Пользовательское меню Python Tk

Итак, мой вопрос: есть ли способ потерять «одну функцию за пункт меню»? как в полноценном меню, которое добавит достаточно капитальный ремонт.

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

Опубликуйте минимальный пример своего кода здесь. –

ответ

0

При попытке назначить функцию с аргументом в add_command конструктору чтобы функция запускается на выполнение при запуске меню.

При добавлении команды вы должны дать ему . Если вы хотите передать аргументы, вы можете сделать это, создав вызываемый либо lambda, либо 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)) 
Смежные вопросы