当我在stackoverflow上问问题的时候,我总是觉得答案是。。。应该是。。。RTFM,即使我得到的每一个回答都是友好、耐心和接受的。经过一个下午的努力寻找答案,我被困住了。我想打开一个Tkinter,文本框和绑定键(键盘快捷键)和一个菜单项,这样我就有一个不错的弹出式菜单(又名上下文菜单)像窗口的记事本,你右键单击并看到
Cut
Copy
Paste
-----
Select All
使用Ctrl+X,Ctrl+C,Ctrl+V和Ctrl+A作为键绑定(我还没有弄清楚如何撤消)。问题是我不能同时使用键绑定和菜单弹出来使用同一个函数。如果我在select_all()的定义中添加或删除“event”参数,一个有效,另一个不行
^{pr2}$在键绑定上面写的方式是有效的,但是菜单项给了我:
TypeError: select_all() takes exactly 1 argument (0 given)
我可以只写两个函数,但这看起来真的很低效,也不能解释为什么程序会这样做。在
这里的问题是,当您将一个函数绑定到一个用户输入事件(如按键或鼠标单击),然后用该事件调用它时,它会将事件发送给该函数。这是非常有用的,因为也许你想把鼠标点击的位置传递给一个应该在画布上画一个点的函数。但是,如果click或keypress仅用作加速器,则传递的事件没有任何用处。这本身并不是很糟糕,但是如果你想在没有按键或者鼠标点击的情况下访问这个功能,比如通过菜单中的命令呢?它不会发送事件,而您的函数需要一个事件。在
有多种方法可以解决这个问题。在
用
def select_all(event=None)
而不是def select_all(event)
定义函数。这将允许您的函数需要0或1个参数,如果没有参数传递给它,则默认为event
的None
。(谢谢,@Bryan。)用
def select_all(*event)
而不是def select_all(event)
定义函数。这将允许您的函数期望任何数量的位置参数,包括0或1。它的通用名称是*args
,或“star args”。用
popupmenu.add_command(label="Select All", command=lambda: select_all(0))
绑定菜单命令。这定义了一个内联函数,该函数包含用一个参数调用select_all
函数。这个论点是垃圾,但你无论如何都没有用,所以一切都很好。我认为在tkinter
中,您也可以用command=select_all, 0
来绑定命令,但是lambda
结构更受欢迎,因为它在tkinter
之外很有用,而且是一个很好学的语言特性(例如,用sorted(mylist, key=lambda x: x[1])
对iterable进行排序)。相关问题 更多 >
编程相关推荐