大家好,我有一小段代码,当程序运行时,我会在一个文件中为我在键盘上按下的每一个键打分,每行一个。问题是,我希望每一行都有一个ID,显然,这个ID每次都是不同的,我认为更简单的方法是让这个ID成为一个int,在每次写操作后递增;但我就是不能让它工作,它总是打印相同的内部
# detect key press
def on_press(key, myint=0):
try:
f = open("logger.txt", "a")
upper = str(key.char).upper()
f.write('{' + '"KeyPressed"' + ':' + '"' + upper + '","_id":"' + str(myint) + '"},' 'n')
myint += 1
f.close()
...
with keyboard.Listener(
on_press=on_press) as listener:
listener.join()
在这种情况下,如果我运行程序并按:A S D输出为:
{"KeyPressed":"A","_id":"0"},
{"KeyPressed":"S","_id":"0"},
{"KeyPressed":"D","_id":"0"},
有可能实现我的目标吗?
问题是,每次调用on_press
时,它都会获得myint
的新副本,而不是使用更改的持久副本。
您可以通过一个简单的闭包来修复它,该闭包将状态保存在父函数中:
def get_on_press(myint=0):
def on_press(key):
nonlocal myint
print("on_press: key: {} myint: {}".format(key, myint))
myint += 1
return on_press
on_press = get_on_press()
然后可以正常调用on_press
:
>>> on_press("a")
on_press: key: a myint: 0
>>> on_press("b")
on_press: key: b myint: 1
>>> on_press("c")
on_press: key: c myint: 2
>>>