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

OldKeyCharは空のリストなので、これを実行すると、whileループに入り、次にループに入り、forに割り当て0られnumます。キーが押されている場合、OldKeyChar[0]存在しない を試してチェックします。

あなたの場合のこれに対する解決策は、リストに0s を事前に入力することです。これを実行しようとしましたが、何らかの理由で代わりに空のリストを渡しています。数値は不変であるため、リストを乗算するだけで、実際にはこの事前入力済みのリストをより簡単に作成できます。

loop(OldKeyChar=[0]*128)

PEP-8CapWordsは、クラス用に予約し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 に答える
1

関数に空のリストを渡しているからloopですか?

loop(OldKeyChar=[])

これだけであるべきです:

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

する必要があります

loop(OldKeyChar)
于 2013-02-15T04:11:49.973 に答える