2016-03-16 7 views
1

Я пытаюсь написать скрипт python, который автоматически запускает внешнюю программу, нажимая кнопки и вводя клавиатуру (обычно путь к файлам) с помощью pyautogui. Теперь, если я пытаюсь использовать funktion pyautogui.typewriter (путь к файлу), он всегда отображает обратную косую черту как вопросительные знаки. Этот минимальный пример:кодирование обратной косой черты в pythons pyautogui

pyautogui.typewrite('\\') 

возвращается просто?

Теперь, если я изменить раскладку клавиатуры в настройках системы на английский, он правильно возвращает \

Моей раскладки по умолчанию является немецкой, и я не могу реально изменить, что, поскольку это ухудшит последующие этапы программы из-за к неправильным форматам даты. Любые идеи, как решить эту проблему?

ответ

1

Хорошо, я, наконец, есть обходной путь, основанный на этой дискуссии:.. https://github.com/asweigart/pyautogui/issues/46

Я возился вокруг в _pyautogui_win.py и изменил ввод с клавиатуры для «\» я получил виртуальный keyc odes на моей клавиатуре с помощью этого удобного инструмента: http://www.delphiforfun.org/Programs/Utilities/KeyCodes.htm#Download и преобразовал их в шестнадцатеричные коды. Затем я сменил функцию _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 

Теперь все работает нормально.Я думаю, что это решение может быть применено к любым неанглийским раскладкам клавиатуры.

+0

Это интересно. Но если вы все равно используете Windows, вы можете просто использовать ['win32api.LoadKeyboardLayout'] (http://docs.activestate.com/activepython/2.4/pywin32/win32api__LoadKeyboardLayout_meth.html). Это может быть выгодно для вашего использования изменение _pyautogui_win.py - таким образом вы можете обмениваться форматами без постоянного изменения чего-либо. – sytech

+0

Я действительно пробовал этот подход, а также не смог найти коды локали. Я нашел их сейчас (https://msdn.microsoft.com/en-us/library/ms912390(v=winembedded.11).aspx). Возможно, это будет выгодно, потому что если пакет когда-нибудь обновится, мой код перепутался – user2160180

0

Проблема (я думаю), что вы избежали цитат и с \»

честно, я не знаю, сколько обратных косых вам нужно (я никогда не использовал pyautogui, но я думаю, что это проблема с Python, а не проблема с пакетом), поэтому попробуйте «\\» и «\\» и «\\\». Помимо этого, я думаю, вы должны попытаться найти другое решение.

+0

Добавление большего количества обратных косых черт дает мне больше вопросов, если сумма четная, и ошибка EOL, если сумма нечетная. Не проблема в строковой кодировке python? Я попытался прочитать sys.getdefaultencoding, но это utf-8, независимо от того, какая у меня клавиатура. – user2160180

1

Это не проблема кодирования, как таковая. Это связано с тем, как pyautogui отправляет ввод с клавиатуры. Он посылает нажатие клавиши, которое, по крайней мере, в этом случае, не учитывает раскладку клавиатуры (для этого используется метод pyautogui).

Существует нет прямого решения, встроенного в pyautogui для указания клавиатуры локали. Итак, я вижу пару разных вариантов ...

(1) Вы можете создать функцию, которая по мере необходимости изменит раскладку клавиатуры (как именно вы это делаете, зависит от платформы), вы можете даже выполнить это, используя pyautogui команды.

(2) Вместо того, чтобы вводить вход \\ для обратных косых черт, введите вход, который будет производить \ на немецкой клавиатуре. При необходимости вы можете определить функцию, которая примет строковый аргумент, который переводит символы проблемы в этой строке в эквивалентные команды (0), которые будут выдавать желаемый результат на немецкой клавиатуре. От взгляда на изображение немецкой клавиатуры это на самом деле выглядит как \ и ? находятся на том же ключе, так что вы, вероятно, просто нужно добавить модификатор как сдвиг (редактирование: вот an example of someone doing this with a French keyboard и pyautogui

(3) Рассмотрим вызова файлов другим способом, кроме ввода с клавиатуры, если это возможно, например, в os.system или subprocess.call

+0

Я буду использовать вариант 1 в качестве последнего варианта. Вариант 3 не может быть и речи, потому что программа, которую я вызываю, нуждается в файлах как строки. Сейчас я пытаюсь выбрать вариант 2. Итак, pyautogui.platformModule.keyboardMapping показывает мне, что код для обратной косой черты равен 1755, что, по-видимому, является вопросительным знаком. Теперь я должен переназначить это, но как узнать, какое значение является обратная косая черта на моей клавиатуре? – user2160180

+0

Какую платформу вы используете? Вы также можете использовать коды клавиш alt. Как и в случае, когда вам нужно ввести обратную косую черту, используйте код клавиши alt для обратного слэша, который равен 92. – sytech

+0

Я использую Windows 7 с python 3.5. когда я переназначаю косую черту с помощью pyautogui.platformModule.keyboardMapping ["\\"] = 92 pyautogui.typewrite ('\\') не выдаёт видимого результата. – user2160180