1

每次在 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=[])
4

3 回答 3

1

因为您将一个空列表传递给loop函数?

loop(OldKeyChar=[])

应该是这样的:

loop(OldKeyChar)
于 2013-02-15T04:11:23.260 回答
1
loop(OldKeyChar=[])

应该

loop(OldKeyChar)
于 2013-02-15T04:11:49.973 回答
1

OldKeyChar是一个空列表,所以当你运行它时,它会进入while循环,然后进入for循环,分配0num. 如果某个键被按下,它将尝试检查OldKeyChar[0]不存在的 。

在您的情况下,解决方案是用0s 预填充列表。您已尝试执行此操作,但由于某种原因,正在传递一个空列表。由于数字是不可变的,您实际上可以通过简单地将列表相乘来更轻松地构建这个预填充列表:

loop(OldKeyChar=[0]*128)

请注意,PEP-8建议CapWords为课程保留,并lowercase_with_underscores为其他内容使用。

请注意,我认为这不是一个很好的实现。相反,请考虑使用set在特定循环中按下的值:

def loop():
    print("Beginning Checks")
    while(True):
        pressed = {i for i in range(0, 127) if win32api.GetAsyncKeyState(i)}

这里用集合理解构造。这允许您检查一个键是否被按下(如果它在pressed,它是,如果不是,它不是),并且不需要重置它,因为它将在下一次迭代中被替换(如果你必须保持与您在其他地方使用对它的引用相同的集合,您可以set.clear()在每次迭代中使用它,然后进行更新)。

于 2013-02-15T04:10:34.680 回答