Python 在Tkinter中,如何将被调用函数作为参数传递?

Python 在Tkinter中,如何将被调用函数作为参数传递?,python,tkinter,Python,Tkinter,在使用.add_command()构造菜单栏的Tkinter中,我们需要一个字符串作为加速器参数,该参数将为命令创建热键绑定 我创建了一个方法,检查用户的平台是Mac还是其他,如果是,则返回与其他键组合的命令键字符串 但它不工作->菜单正在生成,如果我单击菜单项,它正在工作,但不使用热键。虽然我能看到⌘ + 在菜单上 我的第一个想法是,self.hot\u key()方法作为参数传递时不被调用 import sys import Tkinter class app(object):

在使用
.add_command()
构造菜单栏的Tkinter中,我们需要一个字符串作为
加速器
参数,该参数将为命令创建热键绑定

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

但它不工作->菜单正在生成,如果我单击菜单项,它正在工作,但不使用热键。虽然我能看到⌘ + 在菜单上

我的第一个想法是,
self.hot\u 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()
佩奇说,

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

因此,您的
加速器
关键字参数正在按设计工作——命令-N符号出现在您的菜单中

正如mgilson在评论中所建议的那样,您可以使用
bind_all
让键盘组合真正起作用

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

FWIW,我从来没有用过这个加速器。我总是只使用
self.gui.bind_all(…)
,但这可能有点难看和粗糙。事实证明,我必须使用
bind
bind_all
将键盘事件绑定到一个方法,
accelerator
只在菜单中显示热键。。所以你的版本不难看也不粗俗,这是正确的做法…很高兴知道。今天早上我学到了一些东西:)好吧,现在只有一件事,我不明白:如果我使用
bind
bind\u all
,那么菜单就不会显示快捷方式
⌘ + N
,即使它们是在
加速器中定义的
->为什么?这很不寻常。它在我的机器上工作,使用Windows 7(并用“控制”代替⌘). 也许这是一个操作系统特有的问题?可能吧..但对我来说,这整件事太混乱了。我的意思是,为什么
command
accelerator
参数在
add\u command
中不能绑定到键..这让人困惑,更不用说它在OS X菜单上没有正确显示:(@PeterVaro:accelerator没有为您进行绑定的原因是有多种方式可以进行绑定,而tkinter不知道您的意图是什么。因此,您可以选择显示您想要的任何内容作为加速器,并且您可以选择以任何方式进行绑定。加速器k并不总是有直接的1:1映射ey到绑定,并且加速器中的可见字符与绑定到的实际键之间并不总是有直接的1:1映射。@PeterVaro:你说如果使用bind,加速器不会出现。这似乎非常不寻常。也许你可以创建一个非常小的程序来重现问题,然后发布sep关于这件事,我有一个特别的问题。