opencv pyautogui_[python]依靠pynput和pyautogui替换ahk

bc9fe3f282ffa0292be2b3ec25d839d5.png

autohotkey当然是不错的工具,但是这个东西的社群一直发展的不行。从开始学习python以后,我就不时会希望能找到别的工具替代ahk。Python的众多包里面确实是有对应的工具的:模拟鼠标和键盘的操作可以用pyautogui,而捕捉热键则可以使用pynput

模拟鼠标点击

这一次的实例是利用python给aegisub这个软件做一个播放的快捷键。在这个软件里面,如果你开始输入字幕以后,想要重新播放选定时间段的音频只能通过鼠标操作,这实在是非常累人的事情。这里通过pyautogui的 locateOnScreen来利用按钮截图找到按钮。

import pyautogui
def click_play_for_aegis():
    ori_pos = pyautogui.position()
    button_play_location = pyautogui.locateOnScreen(
        r'C:UsersAdministratorPicturesplay_button.jpg',
        confidence=0.7
    )
    click_pos_x = button_play_location.left+int(button_play_location.width/2)
    click_pos_y = button_play_location.top+int(button_play_location.height/2)
    pyautogui.click(click_pos_x,click_pos_y)
    pyautogui.moveTo(ori_pos.x,ori_pos.y)

需要注意的是:

  1. 我的aegisub软件是放在主显示器上面的,如果放在副显示器上有时会出错
  2. locateOnScreen是识别按钮位置的主要语句。添加了confidence这个可选参数以后可以让pyautogui作模糊的搜索,但是,如果要用这个参数首先要安装opencv。关于如何安装opencv的python binding,可以参考我之前的这个文章(mac os与否影响不大):路人乙小明:open cv,tensorflow这些包在Mac os中的安装
  3. locateOnscreen返回的是一个box对象,包括x坐标,y坐标,宽度和高度,用这些就可以算出中心点,然后让鼠标去点击那个中心点就好了

pyautogui的文档可以参考这里https://pyautogui.readthedocs.io/en/latest/

添加快捷键

到这里我们还没有个上面的功能添加快捷键。这个功能需要依靠pynput这个包来实现。(pynput这个包最近几年没有更新了,这是比较可惜的事情),文档在这里

具体到添加快捷键这一部分,pynput有一个叫做GlobalHotKeys的类可以帮你快速添加快捷键,比如像下面的代码就可以把ctrl+p绑定给刚才定义的函数click_play_for_aegis

from pynput import keyboard
def on_activate_p():
    click_play_for_aegis()

with keyboard.GlobalHotKeys({'<ctrl>+p':on_activate_p}) as h:
    h.join()

接下来只需要运行这个python代码,然后ctrl+p[1]这个快捷键就可以实现点击特定按钮的功能了。


如果你想知道某一个按键的名称是什么,那可以参考文档里面的代码:

# hotkey name probe0-------------------
def on_activate_p():
    print('windows+p pressed')
    click_play_for_aegis()

with keyboard.GlobalHotKeys({
    '<win>+'
})

def on_press(key):
    try:
        print('alphanumeric key {0} pressed'.format(
            key.char))
    except AttributeError:
        print('special key {0} pressed'.format(
            key))

def on_release(key):
    print('{0} released'.format(
        key))
    if key == keyboard.Key.esc:
        # Stop listener
        return False

# Collect events until released
with keyboard.Listener(
        on_press=on_press,
        on_release=on_release) as listener:
    listener.join()

这样当你按下一个按键的时候,在python的输出里就会写出对应的名称了。

参考

  1. ^顺带一提,好像aegisub里面ctrl+p是播放视频的快捷键,所以刚开始用这个代码的时候播放行为有些奇怪,把ctrl+p这个快捷键从aegisub软件中去除以后就可以正常使用了
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值