在Tkinter中如何传递一个被调用的函数作为参数?

时间:2013-06-21 12:11:03

标签: python tkinter

在Tkinter中使用<menu_item>.add_command()构造菜单栏时,我们需要一个accelerator参数的字符串,它将为命令创建热键绑定。

我创建了一个方法,检查用户的平台是Mac还是其他平台,如果是,则返回Command密钥字符串与其他密钥组合。

但它不起作用 - &gt;菜单正在构建,如果我点击它正在工作的菜单项,但不使用热键。虽然我可以在菜单中看到 + N ..

我的第一个想法是,self.hot_key()方法在作为参数传递时不被调用..

import sys
import Tkinter

class app(object):

    def __init__(self):
        self.gui = Tkinter.Tk()
        self.gui.minsize(width=640, height=320)
        menu = Tkinter.Menu(self.gui)
        filemenu = Tkinter.Menu(menu, tearoff=0)
        filemenu.add_command(
            label       = 'New',
            command     = self.New,
            accelerator = self.hot_key('n')
        )
        menu.add_cascade(
            label = 'File',
            menu  = filemenu
        )
        self.gui.config(menu=menu)

        self.text = Tkinter.Text(self.gui)
        self.text.pack(expand=Tkinter.YES, fill=Tkinter.BOTH)

    def hot_key(self, *keys):
        super_key = 'Command' if sys.platform == 'darwin' else 'Control'
        return '{super}+{keys}'.format(super=super_key, keys='+'.join(keys))

    def New(self):
        print "I'm working!"

App = app()
App.gui.mainloop()

1 个答案:

答案 0 :(得分:3)

根据this页面,

  

“加速器”选项用于指示菜单加速器   应该与此菜单相关联。这实际上并没有创建   加速器,但仅显示菜单项旁边的内容。您   仍然需要自己为加速器创建一个绑定。

因此,您的accelerator关键字参数按设计运行 - 命令N符号出现在菜单中。

正如mgilson在评论中建议的那样,您可以使用bind_all让键盘组合实际执行某些操作。

self.gui.bind_all("<Command-n>", lambda event: self.New())