1. 程式人生 > >PyAutoGUI 簡介【轉】

PyAutoGUI 簡介【轉】

轉載來自:

---------------------------------------------------------------------------------------------------------

PyAutoGUI是一個純Python的GUI自動化工具,其目的是可以用程式自動控制滑鼠和鍵盤操作,利用它可以實現自動化任務,再也不用擔心有重複枯燥的任務了。

安裝:

pip install pyautogui

或在pipy直接下載install

在Py3中安裝提示:

Collecting PIL
  Could not find a version that satisfies the requirement PIL (from
versions: ) No matching distribution found for PIL

依賴包PIL,Py3不支援,可以安裝Pillow 代替:PIL, 然後在install pyautogui

pip install pillow

例子

複製程式碼
import pyautogui
screenWidth, screenHeight = pyautogui.size()
currentMouseX, currentMouseY = pyautogui.position()
pyautogui.moveTo(100, 150)
pyautogui.click()
#  滑鼠向下移動10畫素
pyautogui.moveRel(None, 10) pyautogui.doubleClick() # 用緩動/漸變函式讓滑鼠2秒後移動到(500,500)位置 # use tweening/easing function to move mouse over 2 seconds. pyautogui.moveTo(1800, 500, duration=2, tween=pyautogui.easeInOutQuad) # 在每次輸入之間暫停0.25秒 pyautogui.typewrite('Hello world!', interval=0.25) pyautogui.press('esc') pyautogui.keyDown(
'shift') pyautogui.press(['left', 'left', 'left', 'left', 'left', 'left']) pyautogui.keyUp('shift') pyautogui.hotkey('ctrl', 'c')
複製程式碼

保護措施(Fail-Safes)

Python移動滑鼠、點選鍵盤非常快,有可以導致其他應用出現問題。在這種情況下,程式可能會失控(即使是按照你的意思執行的),那時就需要中斷。如果滑鼠還在自動操作,就很難在程式視窗關閉它。

為了能夠及時中斷,PyAutoGUI提供了一個保護措施。當pyautogui.FAILSAFE = True時,如果把滑鼠游標在螢幕左上角,PyAutoGUI函式就會產生pyautogui.FailSafeException異常。如果失控了,需要中斷PyAutoGUI函式,就把滑鼠游標在螢幕左上角。要禁用這個特性,就把FAILSAFE設定成False

import pyautogui
pyautogui.FAILSAFE = False

通過把pyautogui.PAUSE設定成floatint時間(秒),可以為所有的PyAutoGUI函式增加延遲。預設延遲時間是0.1秒。在函式迴圈執行的時候,這樣做可以讓PyAutoGUI執行的慢一點,非常有用。例如:

import pyautogui
pyautogui.PAUSE = 2.5
pyautogui.moveTo(100,100); pyautogui.click()

所有的PyAutoGUI函式在延遲完成前都處於阻塞狀態(block)。(未來計劃增加一個可選的非阻塞模式來呼叫函式。)

建議PAUSEFAILSAFE一起使用。

移動滑鼠

PyAutoGUI使用x,y座標,螢幕左上角座標是(0, 0)。

使用pyautogui.size()函式獲得螢幕的解析度:

import pyautogui
 
pyautogui.size()
# (1366, 768)
width, height = pyautogui.size()

moveTo函式,絕對座標

import pyautogui
for i in range(10):
      pyautogui.moveTo(300, 300, duration=0.25)
      pyautogui.moveTo(400, 300, duration=0.25)
      pyautogui.moveTo(400, 400, duration=0.25)
      pyautogui.moveTo(300, 400, duration=0.25)

上面程式碼讓滑鼠順時針移動,並劃10次方框。

劃圓:

複製程式碼
import pyautogui
import math
 
width, height = pyautogui.size()
 
r = 250  # 圓的半徑
# 圓心
o_x = width/2
o_y = height/2
 
pi = 3.1415926
 
for i in range(10):   # 轉10圈
    for angle in range(0, 360, 5):  # 利用圓的引數方程
        X = o_x + r * math.sin(angle*pi/180)
        Y = o_y + r * math.cos(angle*pi/180)
 
        pyautogui.moveTo(X, Y, duration=0.1)
複製程式碼

moveRel()函式,相對座標。以當前滑鼠所在位置為基點:

複製程式碼
import pyautogui
 
for i in range(10):
    pyautogui.moveRel(100, 0, duration=0.25)
    pyautogui.moveRel(0, 100, duration=0.25)
    pyautogui.moveRel(-100, 0, duration=0.25)
    pyautogui.moveRel(0, -100, duration=0.25)
複製程式碼

獲得滑鼠所在座標:

import pyautogui
 
x, y = pyautogui.position()

實時獲得滑鼠位置座標:

複製程式碼
import pyautogui
try:
    while True:
        x, y = pyautogui.position()
        print(x,y)
except KeyboardInterrupt:
    print('\nExit.')
複製程式碼

滑鼠點選、拖拽和滾輪

滑鼠點選

使用click()函式傳送虛擬滑鼠點選,預設情況下在滑鼠所在的位置點選左鍵。函式原型:

pyautogui.click(x=cur_x, y=cur_y, button='left')
  • x,y是要點選的位置,預設是滑鼠當前位置
  • button是要點選的按鍵,有三個可選值:‘left’‘middle’,  ‘right’

要在當前位置點選右鍵:

import pyautogui
 
pyautogui.click(button='right')

click函式完成了一次滑鼠點選。一次完整的點選包括兩部分,按下mouseDown()和彈起mouseUp()。上面這兩個函式引數和click函式一樣,其實click函式只是簡單的封裝了mouseDown()和mouseUp()函式。

import pyautogui
 
pyautogui.click(100, 100)

每個按鍵按下和鬆開兩個事件可以分開處理:

pyautogui.mouseDown(x=moveToX, y=moveToY, button='left')
pyautogui.mouseUp(x=moveToX, y=moveToY, button='left')
  • pyautogui.doubleClick():滑鼠雙擊,其實就是執行兩次click()函式。
  • pyautogui.rightClick():右擊
  • pyautogui.middleClick():中擊

滑鼠拖拽

拖拽的意思是:按下滑鼠鍵並拖動滑鼠。PyAutoGUI提供了兩個函式:dragTo() 和 dragRel()。它的引數和moveTo() 和 moveRel() 一樣。

注意:duration時間不能太短,拖動太快有些系統會吃不消。

要做多次單擊可以設定clicks引數,還有interval引數可以設定每次單擊之間的時間間隔。例如:

#  雙擊左鍵
pyautogui.click(clicks=2)
#  兩次單擊之間停留0.25秒
pyautogui.click(clicks=2, interval=0.25)
#  三擊右鍵
pyautogui.click(button='right', clicks=2, interval=0.25)

滾輪

使用函式scroll(),它只接受一個整數。如果值為正往上滾,值為負往下滾。

pyautogui.scroll(200)

定位某個按鈕的位置

pyautogui有截圖功能

#  返回一個Pillow/PIL的Image物件
pyautogui.screenshot()
pyautogui.screenshot('foo.png')

如果你不需要擷取整個螢幕,還有一個可選的region引數。你可以把擷取區域的左上角XY座標值和寬度、高度傳入擷取。

im = pyautogui.screenshot(region=(0, 0, 300 ,400))

假如你有一個按鈕要10秒種點選一下,這個任務使用上面介紹的函式可以輕鬆實現。但是我們假設你每次點選這個按鈕它都會變換一個位置(隨機),這時你該怎麼辦?下面我們就來解決這個問題。

首先看一下怎麼使用pyautogui截圖:

複製程式碼
import pyautogui
 
im = pyautogui.screenshot()
 
# 獲得某個座標的畫素
im.getpixel((50, 200))
# (30, 132, 153)
 
# 判斷螢幕座標的畫素是不是等於某個值
pyautogui.pixelMatchesColor(50, 200, (30, 132, 153)) 
# True
複製程式碼

現在我們來解決前面提出的問題。問題的關鍵是怎麼找到按鈕所在的座標。其實很簡單,首先對你要點選的按鈕截個圖,就叫button.png吧。然後使用locateOnScreen函式找到按鈕所在的位置:

import pyautogui
pyautogui.locateOnScreen('button.png')
# (643, 745, 70, 29)

locateOnScreen其實就是簡單的顏色對比,如果有一個畫素不匹配,它就會返回None。這個函式返回了匹配圖形的座標,找到中間點:

x, y = pyautogui.center((643, 745, 70, 29))  # 獲得中心點
pyautogui.click(x, y)
  • locateAllOnScreen():找到所有匹配的位置座標。

要檢查XY座標是否在螢幕上,需要用onScreen()函式來檢驗,如果在螢幕上返回True

import pyautogui
pyautogui.onScreen(0, 0)
# True
pyautogui.onScreen(0, -1)
#False

緩動/漸變(Tween / Easing)函式

緩動/漸變函式的作用是讓游標的移動更炫。如果你不需要用到的話,你可以忽略這些。

緩動/漸變函式可以改變游標移動過程的速度和方向。通常滑鼠是勻速直線運動,這就是線性緩動/漸變函式。PyAutoGUI有30種緩動/漸變函式,可以通過pyautogui.ease*?檢視。其中,pyautogui.easeInQuad()函式可以用於moveTo()moveRel()dragTo()dragRel()函式,游標移動呈現先慢後快的效果,整個過程的時間還是和原來一樣。而pyautogui.easeOutQuad函式的效果相反:游標開始移動很快,然後慢慢減速。pyautogui.easeOutElastic是彈簧效果,首先越過終點,然後再反彈回來。例如:

複製程式碼
#  開始很慢,不斷加速
pyautogui.moveTo(100, 100, 2, pyautogui.easeInQuad)
#  開始很快,不斷減速
pyautogui.moveTo(100, 100, 2, pyautogui.easeOutQuad)
#  開始和結束都快,中間比較慢
pyautogui.moveTo(100, 100, 2, pyautogui.easeInOutQuad)
#  一步一徘徊前進
pyautogui.moveTo(100, 100, 2, pyautogui.easeInBounce)
#  徘徊幅度更大,甚至超過起點和終點
pyautogui.moveTo(100, 100, 2, pyautogui.easeInElastic)
複製程式碼

這些效果函式是模仿Al Sweigart的PyTweening模組,可以直接使用,不需要額外安裝。

如果你想建立自己的效果,也可以定義一個函式,其引數是(0.0,1.0),表示起點和終點,返回值是介於[0.0,1.0]之間的數。

鍵盤按鍵

輸入字串

pyautogui.typewrite():

import pyautogui
 
pyautogui.click(100, 100)
pyautogui.typewrite('Hello world!')

上面的字串是一次輸入,為了唬人可以延遲輸入:

pyautogui.typewrite('Hello world!', 0.25)

PyAutoGUI輸入單個字元還可以,但是一些特殊字元怎麼辦呢?例如上面輸入完Hello World,然後換行繼續輸入。

PyAutoGUI鍵盤表:

‘enter’(或‘return’ 或 ‘\n’)

回車

‘esc’

ESC鍵

‘shiftleft’‘shiftright’

左右SHIFT鍵

‘altleft’‘altright’

左右ALT鍵

‘ctrlleft’‘ctrlright’

左右CTRL

‘tab’ (‘\t’)

TAB

‘backspace’‘delete’

BACKSPACE 、DELETE鍵

‘pageup’‘pagedown’

PAGE UP 和 PAGE DOWN鍵

‘home’‘end’

HOME 和 END鍵

‘up’‘down’‘left’,‘right’

箭頭鍵

‘f1’‘f2’‘f3’….

F1…….F12鍵

‘volumemute’‘volumedown’,‘volumeup’

有些鍵盤沒有

‘pause’

PAUSE鍵

‘capslock’‘numlock’,‘scrolllock’

CAPS LOCKNUM LOCK, 和 SCROLLLOCK 鍵

‘insert’

INSINSERT鍵

‘printscreen’

PRTSC 或 PRINT SCREEN鍵

‘winleft’‘winright’

Win鍵

‘command’

Mac OS X command鍵

import pyautogui
 
pyautogui.click(100, 100)
pyautogui.typewrite('Hello world!', 0.25)
pyautogui.typewrite(['enter', 'a', 'b', 'left', 'left', 'X', 'Y'], '0.25')

按鍵的按下和釋放 和滑鼠按鍵非常類似。

  • keyDown():按下某個鍵
  • keyUp():鬆開某個鍵
  • press():一次完整的擊鍵,前面兩個函式的組合。

alt+F4:

pyautogui.keyDown('altleft');
pyautogui.press('f4');
pyautogui.keyUp('altleft')

直接使用熱鍵函式:

pyautogui.hotkey('altleft', 'f4')

 每個按鍵的按下和鬆開也可以單獨呼叫:

pyautogui.keyDown(key_name)
pyautogui.keyUp(key_name)

訊息彈窗函式

 如果你需要訊息彈窗,通過單擊OK暫停程式,或者向用戶顯示一些資訊,訊息彈窗函式就會有類似JavaScript的功能:

pyautogui.alert('這個訊息彈窗是文字+OK按鈕')
pyautogui.confirm('這個訊息彈窗是文字+OK+Cancel按鈕')
pyautogui.prompt('這個訊息彈窗是讓使用者輸入字串,單擊OK')

prompt()函式中,如果使用者什麼都不輸入,就會返回None

應用

1.開啟瀏覽器以無痕模式瀏覽網頁

複製程式碼
import pyautogui
import subprocess
import win32api
import time
prs=subprocess.Popen(["C:\\Users\\Administrator\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe  "])
time.sleep(1)
pree=pyautogui.hotkey('ctrl', 'shift', 'n')

time.sleep(2)
pyautogui.typewrite('http://geek.csdn.net/news/detail/86546', interval=0.25)
pyautogui.press('enter')
pyautogui.press('enter')
time.sleep(2)
win32api.TerminateProcess(int(prs._handle), -1)
複製程式碼

2.將當前螢幕最頂端應用拖拽到座標(100,200),然後截圖

pyautogui.moveTo(200, 0, duration=0.25)
pyautogui.mouseDown(button='left')
#  移動到(100, 200)位置,然後鬆開滑鼠右鍵
pyautogui.mouseUp(button='left', x=100, y=200)
pyautogui.screenshot('foo.png') 截圖

相關推薦

PyAutoGUI 簡介

轉載來自: --------------------------------------------------------------------------------------------------------- PyAutoGUI是一個純Pytho

MySQL分布式集群之MyCAT(一)簡介

oba 但是 相關 水平切分 團隊 odin out mysql雙主 mys 隔了好久,才想起來更新博客,最近倒騰的數據庫從Oracle換成了MySQL,研究了一段時間,感覺社區版的MySQL在各個方面都遜色於Oracle,Oracle真的好方便!好了,不廢話,這次準備記錄

內核工具 – Sparse 簡介

一次 一段 更新 fedora stat safe volatile 可能 分析工具 轉自:http://www.cnblogs.com/wang_yb/p/3575039.html Sparse是內核代碼靜態分析工具, 能夠幫助我們找出代碼中的隱患. 主要內

yAutoGUI 簡介

轉載來自: https://muxuezi.github.io/posts/doc-pyautogui.html http://blog.topspeedsnail.com/archives/5373   ---------------------

Unicode簡介

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

url的三個js編碼函式escape(),encodeURI(),encodeURIComponent()簡介

引子 瀏覽器URl地址,上網一定會用到,但是瀏覽器地址有中文或者瀏覽器url引數操作的時候,經常會用到encodeURIComponent()和decodeURIComponent()以及encodeURI()等等。關於瀏覽器引數操作,請看文章http://www.haor

Flash Memory 簡介

本文轉載自:https://linux.codingbelief.com/zh/storage/emmc/ Flash Memory 是一種非易失性的儲存器。在嵌入式系統中通常用於存放系統、應用和資料等。在 PC 系統中,則主要用在固態硬碟以及主機板 BIOS 中。另外,絕大部分的 U 盤、SDCard 等

linux中的strings命令簡介

strings - print the strings of printable characters in files.          意思是, 列印檔案中可列印的字元。  我來補充一下吧, 這個檔案可以是文字檔案(test.c), 可執行檔案(test),  動

Kafka:架構簡介

轉:http://www.cnblogs.com/f1194361820/p/6026313.html Kafka 架構簡介 Kafka是一個開源的、分散式的、可分割槽的、可複製的基於日誌提交的釋出訂閱訊息系統。它具備以下特點: ·訊息持久化: 為了從大資料中獲取有價值的資訊,任何資訊的丟失都是負擔不起的。

url的三個js編碼函數escape(),encodeURI(),encodeURIComponent()簡介

encode attribute 翻譯 ans encodeuri meta eric spec 默認 引子 瀏覽器URl地址,上網一定會用到,但是瀏覽器地址有中文或者瀏覽器url參數操作的時候,經常會用到encodeURIComponent()和decodeURICom

nb-iot簡介

tip 100% 產業鏈 clas div 蜂窩網絡 融合 .html sem 轉自:http://www.elecfans.com/tags/nb-iot/ 標簽 > nb-iot nb-iot 關註 118人關註 提供NB-IoT技術特點,

Cron表達式簡介

cond 任務 使用 增量 寫法 minute 星期四 星期六 定時 Cron表達式是一個字符串,字符串以5或6個空格隔開,分為6或7個域,每一個域代表一個含義,Cron有如下兩種語法格式: Seconds Minutes Hours DayofMonth Month D

Nodejs學習筆記(一)--- 簡介及安裝Node.js開發環境

ack 目錄 javascrip 難度 時間 網站開發 clas jetbrains 常用 目錄 學習資料 簡介 安裝Node.js npm簡介 開發工具 Sublime Node.js開發環境配置 擴展:安裝多版本管理器 學習資料   1.深入淺出Node.j

Mysql Group Replication 簡介及單主模式組復制配置

ror ipv4 mysql命令 value tail force action dmi where 一 Mysql Group Replication簡介 Mysql Group Replication(MGR)是一個全新的高可用和高擴張的MySQL集群服務。

Linux下/proc目錄簡介

map kms slab proc文件系統 文件格式 應用 environ 一段時間 內存映射 1. /proc目錄Linux 內核提供了一種通過 /proc 文件系統,在運行時訪問內核內部數據結構、改變內核設置的機制。proc文件系統是一個偽文件系統,它只存在內存當中,而

Oracle-AWR報告簡介及如何生成

資源 解釋 如何 cat oracl 服務器 服務 系統資源 sysdba AWR報告 awr報告是oracle 10g及以上版本提供的一種性能收集和分析工具,它能提供一個時間段內整個系統資源使用情況的報告,通過這個報告,我們就可以了解Oracle數據庫的整個運行情況,比

TCL語法簡介

concat 替換 似的 index 實現 需要 執行 itl PV 1,腳本構成 set a 2 set b 3 // set a 2;set b 3 TCL腳本可以包括多個命令,命令間使用換行符或者分號分開,一個命令使用空格分開命令、變量等其他參數。

理解WebKit和Chromium: JavaScript引擎簡介

正則表達 根據 tco 抽象 由於 介紹 後來 rom 都在 轉載請註明原文地址:http://blog.csdn.net/milado_nju1. 什麽是JavaScript引擎什麽是JavaScript引擎?簡單來講,就是能夠提供執行JavaScript代碼的運行環境。

linux下netlink的使用簡介

原博文連線:http://blog.chinaunix.net/uid-24716553-id-5609723.html netlink是一種用於使用者空間程序與核心間通訊的方法,也可以用於使用者程序之間的通訊(IPC)。 netlink和ioctl比較相似,都能從使用者空

jquery的事件物件event簡介

  什麼是事件物件? 如何拿到當前事件的事件物件? 事件物件有什麼屬性?  event.type 屬性獲取觸發事件名 event.data 獲取額外資料,可以是數字、字串、陣列、物件 event.target獲取當前事件繫結的dom元素  注