3

ボタンをクリックして外部プログラムを自動的に実行し、pyautogui でキーボード入力 (通常はファイルパス) を与える python スクリプトを作成しようとしています。関数 pyautogui.typewriter(filepath) を使用しようとすると、常にバックスラッシュが疑問符として入力されます。この最小限の例:

pyautogui.typewrite('\\')

単純に返しますか?

システム設定でキーボード レイアウトを英語に変更すると、\ が正しく返されます。

私のデフォルトのレイアウトはドイツ語ですが、日付形式が間違っているためにプログラムの後半の段階が台無しになるため、実際には変更できません。この問題を解決する方法はありますか?

4

5 に答える 5

2

それ自体はエンコーディングの問題ではありません。pyautogui がキーボード入力を送信する方法に関係しています。少なくともこの場合、キーボード レイアウトを考慮しないキーストロークを送信しています (pyautoguiこれに使用される実際のメソッドはプラットフォーム固有です)。

pyautoguiキーボード ロケールを指定するための直接的なソリューションは組み込まれていません。だから、私はいくつかの異なるオプションを見ます...

(1) 必要に応じてキーボード レイアウトを変更する関数を作成できます (正確にこれを行う方法はプラットフォーム固有です) pyautogui。コマンドを使用してこれを実行することもできます。

(2)\\バックスラッシュの入力を提供する代わり\に、代わりにドイツ語キーボードで生成される入力を提供します。pyautogui必要に応じて、その文字列内の問題文字を、ドイツ語キーボードで目的の出力を生成する同等のコマンドに変換する文字列引数を受け入れる関数を定義できます。ドイツ語キーボードの写真を見ると、実際には同じキーにあるように見える\ので?、おそらく次のような修飾子を追加するだけで済みますshift(編集:フランス語キーボードと pyautoguiでこれを行っている人の例を次に示します)。

(3) 可能であれば、キーボード入力以外の方法でファイルを呼び出すことを検討してくださいos.systemsubprocess.call

于 2016-03-16T16:16:30.093 に答える
2

わかりました、この議論に基づいて、最終的に回避策があります: https://github.com/asweigart/pyautogui/issues/46

_pyautogui_win.py をいじりました。「\」のキーボード入力を変更しました。http://www.delphiforfun.org/Programs/Utilities/KeyCodes.htm#Downloadという便利なツールを使用して、キーボードで仮想キーコードを取得し、 それらを 16 進コードに変換しました。次に、これを追加して _keyDown 関数を変更しました。

if key == '\\': 
        ctypes.windll.user32.keybd_event(0x11, 0, 0, 0) # should be left control
        ctypes.windll.user32.keybd_event(0x12, 0, 0, 0) # should be alt
        ctypes.windll.user32.keybd_event(0xDB, 0, 0, 0) # should be alt ß
        ctypes.windll.user32.keybd_event(0x11, 0, KEYEVENTF_KEYUP, 0)
        ctypes.windll.user32.keybd_event(0x12, 0, KEYEVENTF_KEYUP, 0)
        ctypes.windll.user32.keybd_event(0xDB, 0, KEYEVENTF_KEYUP, 0)
        return

今、すべてが正常に動作します。このソリューションは、英語以外のキーボード レイアウトにも適用できると思います。

于 2016-03-17T09:10:18.683 に答える