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关于这件事,我有一个特别的问题。