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('n')
for data in datalist:
key, runtime = data.split(' t=')
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 有許多方便的模組及套件可以使用,所以都不太需要自己手刻,基本上都有寫好的程式可用,但將這些功能更進一步的包裝起來,成為自己應用程式中的功能,有是非常重要的!
參考
- python pyautogui 簡介 | 翔想像的實驗筆記
- 使用 pyautogui 進行跨平臺的 GUI 自動化操作 | IT人
- PyAutoGUI : 使用Python控制電腦
- PyAutoGUI’s documentation!
- Python 自動化的樂趣:搞定重複瑣碎&單調無聊的工作(第二版)