【问题标题】:Keyboard binding events tkinter not working [duplicate]键盘绑定事件tkinter不起作用[重复]
【发布时间】:2017-01-03 15:47:48
【问题描述】:

我一直在尝试在 Python 3 中添加一个键盘快捷键来激活一个功能。

from tkinter import *
from tkinter import messagebox
root = Tk()
def myThing():
    messagebox.showinfo("Hi", "Hello")
root.bind_all("<control-m>", myThing)
root.mainloop()

但是当我按下 control m 时,就出现了:

抱歉,复制粘贴不适用于命令提示符

但是,当我这样做时:

from tkinter import *
from tkinter import messagebox
root = Tk()
def myThing(k):
    print(k)
root.bind_all("<Control-m>", myThing)
root.mainloop()

这样做:

我做错了什么?

我知道网上有这样的问题,但我都试过了,得到了这个错误。我问这个问题是因为答案对我来说不够清楚。

PS:这是python 3.5.2

【问题讨论】:

  • 你做错了什么?您没有阅读文档。

标签: python-3.x tkinter


【解决方案1】:

当您将事件绑定到函数时,tkinter 将始终传入一个表示该事件的对象。大多数人将此参数命名为eventevt

def myThing(event):
    ...

该对象包含各种有用的信息,例如对捕获事件的小部件的引用、事件的 x/y 坐标、按下的键(在键盘事件的情况下)等等。

如果您的函数不使用此事件,并且您想将此函数用于绑定和直接调用,您可以使该事件成为可选的。当然,如果你这样做,你必须确保函数的主体不依赖于参数。

def myThing(event=None):
    ...

官方python tkinter docs 以及几乎所有与 tkinter 相关的教程和文档站点都提到了这一点。这就是 python 文档所说的:

... func 是一个 Python 函数,带有一个参数,在事件发生时被调用。一个 Event 实例将作为参数传递。 (以这种方式部署的函数通常称为回调。)

【讨论】:

    【解决方案2】:

    在你的第二个例子中,你说print(k)。结果是打印tkinter.Event 对象。这意味着它有效。但是,在第二个代码 sn-p 中,您绑定了 &lt;Control-m&gt; 而不是 &lt;control-m&gt;。因为&lt;Control-m&gt;似乎可以工作,所以只需将第一个代码sn-p中的c大写即可。

    读取错误。问题是给myThing() 提供了1 个参数。但是,在您的第一个代码 sn-p 中,您将 myThing() 定义为 def myThing() 而不是 def myThing(k)

    阅读和理解 Python 中的错误是一项非常有价值的技能。如果您知道 Python 给出的错误类型,就可以轻松破译问题所在。

    【讨论】:

    • 我试过了,但同样的事情发生了
    • @Stiffy2000 我已经修正了我的答案:)
    • 我仍然希望它用作myThing() 而不是myThing(variable),简而言之,我不想在那里有k。我只是观察到绑定事件返回了一些东西。不过,我不希望它这样做。
    • @Stiffy2000 你必须这样做。 Tkinter 将始终将事件对象传递给myThing()。有时事件对象中的数据很有用,比如如果产生了鼠标点击事件,你可以确定它的坐标。
    • 有办法静音吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 2020-12-24
    相关资源
    最近更新 更多