【问题标题】:encoding of backslash in pythons pyautoguipython pyautogui中反斜杠的编码
【发布时间】:2022-01-12 02:57:32
【问题描述】:

我正在尝试编写一个 python 脚本,该脚本通过单击按钮自动运行外部程序并使用 pyautogui 提供键盘输入(通常是文件路径)。 现在,如果我尝试使用功能 pyautogui.typewriter(filepath) 它总是将反斜杠键入为问号。 这个最小的例子:

pyautogui.typewrite('\\')

简单地返回?

现在,如果我将系统设置中的键盘布局更改为英文,它会正确返回 \

我的默认布局是德语,我无法真正更改它,因为错误的日期格式会弄乱程序的后期阶段。 任何想法如何解决这个问题?

【问题讨论】:

    标签: python string encoding pyautogui


    【解决方案1】:

    这本身不是编码问题。它与 pyautogui 如何发送键盘输入有关。它正在发送一个击键,至少在这种情况下,不考虑键盘布局(pyautogui 用于此的实际方法是特定于平台的。)

    pyautogui 没有内置用于指定键盘区域设置的直接解决方案。所以,我看到了几个不同的选择......

    (1) 您可以创建一个函数来根据需要更改您的键盘布局(具体操作方式因平台而异)您甚至可以使用pyautogui 命令来执行此操作。

    (2) 不要为反斜杠提供输入 \\,而是提供将在德语键盘上产生 \ 的输入。如有必要,您可以定义一个函数,该函数将接受一个字符串参数,将该字符串中的问题字符转换为等效的pyautogui 命令,从而在德语键盘上产生所需的输出。从一张德语键盘的图片来看,它实际上看起来像 \? 在同一个键上,所以你可能只需要添加一个像 shift(编辑:这里是an example of someone doing this with a French keyboard 和 pyautogui

    (3) 如果可能,考虑通过键盘输入以外的其他方法调用文件,例如os.systemsubprocess.call

    【讨论】:

    • 我会保留选项 1 作为最后的选择。选项 3 是不可能的,因为我正在调用的程序需要将文件作为字符串。我现在正在尝试选项 2。所以 pyautogui.platformModule.keyboardMapping 告诉我反斜杠的代码是 1755,这显然是问号。我现在应该重新映射它,但是我如何找出键盘上的反斜杠的值?
    • 您使用的是什么平台?您也可以使用 alt 键代码。就像在任何时候需要输入反斜杠时,使用 alt 键代码作为反斜杠,即 92。
    • 我正在使用带有 python 3.5 的 Windows 7。当我用 pyautogui.platformModule.keyboardMapping["\\"]=92 重新映射斜线时, pyautogui.typewrite('\\') 不会产生可见的输出。
    • 澄清一下,using alt codes 是一种输入字符的方法,方法是按住 alt 键,然后输入一系列数字来生成一个字符。这是与键盘重新映射不同的方法,它完全使用不同的值。因此,这与我建议的制作函数的方法相一致,该函数将您所需的字符串转换为一系列 pyauto 命令,这些命令将产生所需的输出。但是由于您使用的是 Windows,因此您实际上可以使用 win32api 相对轻松地即时更改键盘布局
    【解决方案2】:

    好的,我终于有了一个解决方法,基于这个讨论: https://github.com/asweigart/pyautogui/issues/46

    我在 _pyautogui_win.py 中进行了修改。并更改了“\”的键盘输入。 我使用这个方便的工具在键盘上获得了虚拟键码: 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
    

    现在一切正常。我认为这个解决方案可以应用于任何非英文键盘布局。

    【讨论】:

    • 这很有趣。但是,如果您无论如何都使用 Windows,则可以只使用 win32api.LoadKeyboardLayout 这可能比修改 _pyautogui_win.py 更有利于您的用例——这样您就可以在不永久更改任何内容的情况下交换格式。
    • 我实际上也尝试过这种方法,但无法找到语言环境代码。我现在找到了它们(msdn.microsoft.com/en-us/library/…)它可能确实是有利的,因为如果有一天软件包有更新,我的代码就会混乱
    【解决方案3】:

    问题(我认为)是您也用 \' 转义了引用

    老实说,我不知道你需要多少个反斜杠(我从未使用过 pyautogui,但我认为这是 Python 的问题,而不是包的问题),所以试试 '\\' 和 '\\'和 '\\\'。除此之外,我认为您应该尝试寻找其他解决方案。

    【讨论】:

    • 添加更多反斜杠只会给我更多的问号,如果金额是偶数,如果金额是奇数,则会出现 EOL 错误。是不是python的字符串编码有问题?我尝试阅读 sys.getdefaultencoding,但无论我使用哪种键盘布局,这都是 utf-8。
    【解决方案4】:

    我遇到了同样的问题,但我正在使用 Linux。对我来说,解决方案就是使用除法。

    当我输入“cd /home/pi”时,“/”从未出现,解决方案是:

    if key == '/':
        pyautogui.press('divide')
    

    它对我有用!

    【讨论】:

      【解决方案5】:

      看起来很难,但实际上很简单,你只需创建一个变量并在其中输入“\\”,然后在 pyautogui 中编写变量,如下所示:

      x = "\\"
      pyautogui.write(x)
      

      我想你的问题现在已经解决了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-26
        • 1970-01-01
        • 2021-08-23
        • 2013-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多