Python

Python:用 PyAutoGUI 來操控滑鼠及鍵盤

最近軍中的朋友問能不能自動按鍵盤,我馬上想到之前看過的書 — 「Python 自動化的樂趣:搞定重複瑣碎&單調無聊的工作(第二版)」,其中第18章是用 pyautogui 來完成 GUI 自動化控制,就趁著休假來時做看看。

基本上會 Python 的人就能操作,也可以在 Linux, Windows, Mac 使用,算是非常好用的模組,而且網路上也有很多資料可以看,要學習完全不是問題。

而根據官方文件所說,PyAutoGUI 具有這些功能:

  • 模擬滑鼠行為
  • 鍵盤控制
  • 截取屏幕截圖

這次主要針對按鍵進行實作吧!

安裝

要使用之前必須先安裝 PyAutoGUI 才行

pip install pyautogui

測試滑鼠功能

import pyautogui

while True:
    x, y = pyautogui.position()
    print(“x: {:04d} y: {:04d}”.format(x, y))

這樣抓到滑鼠在螢幕中的座標位置,再來看看如何操作鍵盤。

測試鍵盤功能

使用 write() 指令,就可以自動輸入文字。
(不過需要手動點選要術入的文字框)

import pyautogui

pyautogui.write(‘Hello world!’)
pyautogui.write(‘Hello world!’, interval=0.25)

可以加入 interval 來設定間隔時間

使用 press() 指令,可以直接模擬按下到放開的過程,也可以使用 keyDown()keyUp() 這兩個指令。
(根據官方文件,press() 只是將 keyDown()keyUp() 包裝起來)

import pyautogui

pyautogui.kwyDown(‘ctrl’)
pyautogui.press(‘left’)
pyautogui.kwyUp(‘ctrl’)

這樣就實現了按壓、長按鍵盤的功能。

使用 hotkey(),可以模擬快捷鍵的功能。

import pyautogui

#TODO: select something for copy
pyautogui.hotkey(‘ctrl’, ‘c’)

#TODO: find target for paste
pyautogui.hotkey(‘ctrl’, ‘v’)

非常簡單就完成複製及貼上。

鍵盤表


['\t', '\n', '\r', ' ', '!', '"', '#', '$', '%', '&', "'", '(',
')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`',
'a', 'b', 'c', 'd', 'e','f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
'accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace',
'browserback', 'browserfavorites', 'browserforward', 'browserhome',
'browserrefresh', 'browsersearch', 'browserstop', 'capslock', 'clear',
'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal', 'del', 'delete',
'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10',
'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20',
'f21', 'f22', 'f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9',
'final', 'fn', 'hanguel', 'hangul', 'hanja', 'help', 'home', 'insert', 'junja',
'kana', 'kanji', 'launchapp1', 'launchapp2', 'launchmail',
'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack',
'nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6',
'num7', 'num8', 'num9', 'numlock', 'pagedown', 'pageup', 'pause', 'pgdn',
'pgup', 'playpause', 'prevtrack', 'print', 'printscreen', 'prntscrn',
'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select', 'separator',
'shift', 'shiftleft', 'shiftright', 'sleep', 'space', 'stop', 'subtract', 'tab',
'up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen',
'command', 'option', 'optionleft', 'optionright']

搭配 tkinter 實現客製化指令

程式碼:https://github.com/jacky10001/KeyboardHelper

目前僅使用 press() 指令,來設定要按的按鍵以及使用 time.sleep() 來延遲下一個按鍵的時間

def writeText(textData):
    global th_sta
    time.sleep(2)
    status_text.set(" Running")
    while th_sta:
        try:
            datalist = textData.split(&#039;n&#039;)
            for data in datalist:
                key, runtime = data.split(&#039; t=&#039;)
                print(key, runtime)
                pyautogui.press(key)
                time.sleep(float(runtime))
                if not th_sta:
                    break
        except:
            th_sta = False
            status_text.set(" Error")

這裡面為了保持操作介面不被迴圈干擾,也使用 threading 這個模組來實現多執行緒,這樣中途就可以立刻按下 Stop 按鈕。


實作操作介面

在這小程式中用了許多以前學到的觀念,像是函數的寫法、多執行緒處理、GUI設計、物件導向等觀念,如果有時間再來看看要不要包裝更多功能進來,雖然現在 Python 有許多方便的模組及套件可以使用,所以都不太需要自己手刻,基本上都有寫好的程式可用,但將這些功能更進一步的包裝起來,成為自己應用程式中的功能,有是非常重要的!

參考

留下一個回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *