我一直在尝试在 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()
但是当我按下控制器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
答案 0 :(得分:1)
将事件绑定到函数时,tkinter将始终传入表示事件的对象。大多数人将此参数命名为event
或evt
:
def myThing(event):
...
此对象具有各种有用的信息,例如对捕获事件的窗口小部件的引用,事件的x / y坐标,按下的键(在键盘事件的情况下)等等。
如果您的函数没有使用此事件,并且您希望将此函数用于绑定和直接调用,则可以使事件可选。当然,如果你这样做,你必须确保函数的主体不依赖于参数。
def myThing(event=None):
...
官方python tkinter docs以及与tkinter相关的每个教程和文档站点都提到了这一点。这就是python文档所说的:
... func 是一个Python函数,在事件发生时调用一个参数。 Event实例将作为参数传递。 (以这种方式部署的函数通常称为回调。)
答案 1 :(得分:0)
在您的第二个示例中,您说 df = pd.read_csv(open("name_of_the_csv.csv"))
for i in xrange(len(df.columns)):
column_list = df[df.columns[i]].values
。结果是打印print(k)
对象。这意味着它有效。但是,在第二个代码段中,您绑定了tkinter.Event
而不是<Control-m>
。由于<control-m>
似乎有用,只需将第一个代码段中的<Control-m>
大写。
阅读错误。问题是给c
一个论点。但是,在您的第一个代码段中,您已将myThing()
定义为myThing()
而不是def myThing()
。
阅读和理解Python中的错误是一项非常有价值的技能。如果您知道Python提供的错误类型,您可以轻松解读问题所在。