2013-06-21 17 views
3

在Tkinter中为<menu_item>.add_command()构建菜单栏我们需要一个字符串作为accelerator参数,它将为命令创建热键绑定。在Tkinter中如何传递一个被调用的函数作为参数?

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

但它不起作用 - >正在建立菜单,如果我点击它正在工作的菜单项,但不能使用热键。虽然我可以看到在菜单中 + ň ..

我首先想到的是,虽然作为参数传递的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

FWIW,我从来没有用过这个加速器的东西。我总是只是'self.gui.bind_all(...)',但这可能更丑陋和黑客。 – mgilson

+0

事实证明,我不得不使用'bind'或'bind_all'来将键盘事件绑定到一个方法上,'accelerator'只在菜单中显示热键。所以你的版本不是丑陋或者是黑客,那是正确的做法.. –

+0

很高兴知道。今天早上我学到了一些东西:) – mgilson

回答

3

this

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

因此,您的accelerator关键字参数按设计工作 - Command-N符号出现在您的菜单中。

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

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

好吧,现在只有一件事,我不明白:如果我使用'bind'或'bind_all',那么菜单不会显示快捷键'⌘+ N',即使它们是在'accelerator'中定义的 - >为什么是这样呢? –

+0

这很奇怪。它在我的机器上运行,使用Windows 7(并使用“Control”代替⌘)。也许这是一个特定于操作系统的问题? – Kevin

+0

也许..但对我来说,这整个事情太sooo凌乱。我的意思是,为什么在'add_command'中有'command'和'accelerator'参数,如果这些参数不能绑定到键......这很令人困惑,更不用说在OS X菜单上不能正确显示:( –

相关问题