【问题标题】:Can Python be used to send a true key down event to Mac可以使用 Python 向 Mac 发送真正的按键事件吗
【发布时间】:2013-07-09 04:23:32
【问题描述】:

我的问题是,有没有什么方法可以在带有 applescript/python 的 mac 上可靠地按住一个键?

我几乎在所有地方都搜索过这样的主题,但是,没有一个能把它删掉。我正在尝试使用 Python 从 Arduino 读取串行信息,然后将这些信号作为按键传递。我已经看到如何使用applescript向系统事件发送“key down”,如下代码所示:

(Python code)
    def SendDown(key):
    string = str(key)
    cmd = """osascript -e 'tell application "System Events" to key down (key code """ + string   + ")'"
    os.system(cmd)

此代码通常可以正常工作,但是,我想控制 Google 飞行模拟器。当我尝试这样做时,按键似乎是一种快速的方式,飞行模拟器或基本的谷歌地球地图移动的只是我预期的一小部分。

我使用这段代码的方式基本上如下(suedocode)

if (ArduinoMessage == "left"):
    SendDown(leftKey) #leftKey has been set to 123 -- the code for the left arrow key
    etc...

从我的角度来看,我发送的按键按下事件本质上是一个快速按键并且按键没有被按住。我尝试直接在 applescript 中对关键事件进行编程,并取得了一点成功。我的代码看起来像这样:

tell application "System Events"
    repeat 50 times    
        key down (key code 123)
    end repeat
    key up (key code 123)
end tell

该代码比我得到的移动谷歌地球地图的次数更多,但它需要很长时间才能移动少量(远少于普通的箭头键)。然后我尝试将那个 applescript 写进 Python 并失去了所有改进。

所以我重申这个问题——有什么方法可以可靠地按住带有 applescript/python 的 mac 上的键?

我能够相当轻松地让它在 Windows 上运行,但是,我能够使用一个名为 SendKeys 的仅限 Windows 的库,该库专为此类应用程序而设计。

任何帮助将不胜感激。

谢谢,

杰克

【问题讨论】:

  • 在我看来很棒的名字。

标签: python macos applescript keypress keydown


【解决方案1】:

使用PyUserInput。 试试下面的代码。

import time

import pykeyboard


# TODO: Replace following two lines with the code that activate the application.
print('Activate the application 3 seconds.')
time.sleep(3)

k = pykeyboard.PyKeyboard()
k.press_key(k.left_key)
time.sleep(1) # Hold down left key for 1 second.
k.release_key(k.left_key)

不幸的是,我没有 Mac。我在 Linux、Windows 中进行了测试。

【讨论】:

  • 好建议 falsetru,事实证明它在 Mac 上不起作用。显然 pykeyboard 只有 Windows 和 Linux。 (请参阅here)但是,我能够从他们那里得到一个建议——autopy,这可能适用于 Mac。所以你的建议没有白费。谢谢。
  • 我一直在研究 autopy,但很多人无法在 Mac 上安装它,xcode 也是必需的下载。我希望我的应用程序能够快速安装——因为 xcode 接近 2gb,这似乎不是很有用。希望有人存在另一种方法。
  • @Jake,如何使用 PyMouse(包含在 PyUserInput 中)。使用 PyMouse 需要一些计算,但不需要休眠。
  • @Jake,还有另一种选择:Sikuli。它需要您安装 Java。
  • 我真的很喜欢Sikuli,它运作良好,但是似乎有点笨重。我确实接受了你关于在 applescript 中使用延迟的建议。事实证明,纯苹果脚本可以正常工作。我相信发生的事情是,当我通过 Python 告诉 applescript 按下键时,由于之后立即结束,我相信本质上,键按下是在按下键后立即发送的。我相信通过 python 中的多线程,我可以实现一些运行大量实际延迟的 applescript 的东西。我会尽快发布完成的代码(如果有效)。感谢您的所有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多