每次在Windows中按下某个键时,我都会使用此代码记录按键。在我看来,代码是完美的;没有不必要的循环或未定义的变量,它应该工作得很好。
但是,我一直在终端中得到这个:
Everything Imported Successfully
Starting Loop
Beginning Checks
Traceback (most recent call last):
File "C:\Users\***\relogged.pyw", line 15, in <module>
loop(OldKeyChar=[])
File "C:\Users\***\relogged.pyw", line 9, in loop
if OldKeyChar[num] == '1': #check to see if key was pressed
IndexError: list index out of range
我错过了什么?它应该工作,但我的代码会导致错误。
import win32api
print("Everything Imported Successfully")
def loop(OldKeyChar):
print("Beginning Checks")
while(True): #always checking
for num in range(0,127): #iterate through list of ascii codes
if not win32api.GetAsyncKeyState(num): #if key is not being pressed
if OldKeyChar[num] == '1': #check to see if key was pressed
OldKeyChar[num] = '0' #make sure not recorded again
else:
OldKeyChar[num] = '1' #add pressed key to pressed list
OldKeyChar = ['0' for i in range(0,127)]
print("Starting Loop")
loop(OldKeyChar=[])
答案 0 :(得分:1)
OldKeyChar
是一个空列表,因此当您运行此列表时,它将进入while
循环,然后输入for
循环,将0
分配给{{1} }}。如果正在按下某个键,它将尝试检查不存在的num
。
在您的情况下解决此问题的方法是使用OldKeyChar[0]
预填充列表。您试图这样做,但由于某种原因,正在传递一个空列表。由于数字是不可变的,您可以通过简单地将列表相乘来实际构建此预填充列表:
0
请注意,PEP-8建议为类保留loop(OldKeyChar=[0]*128)
,并将CapWords
用于其他内容。
请注意,我认为这不是一个很好的实现。相反,请考虑使用在特定循环中按下的lowercase_with_underscores
值:
set
这里用set comprehension构造。这允许你检查一个键是否被按下(如果它在def loop():
print("Beginning Checks")
while(True):
pressed = {i for i in range(0, 127) if win32api.GetAsyncKeyState(i)}
,它是,如果不是,它不是),并且没有必要重置它,因为它将在下一次迭代(如果你必须保持与在别处使用它的引用相同的集合,你可以在每次迭代时pressed
,然后进行更新。
答案 1 :(得分:1)
因为您将空列表传递给loop
函数?
loop(OldKeyChar=[])
应该就是这样:
loop(OldKeyChar)
答案 2 :(得分:1)
loop(OldKeyChar=[])
应该是
loop(OldKeyChar)