本文介绍怎样使用Python进行跨平台的GUI操作的,其中使用的一个工具包是pyautogui,PyAutoGUI可以模拟鼠标的移动、点击、拖拽,键盘按键输入、按住操作,以及鼠标+键盘的热键同时按住等操作,可以说手能动的都可以。

首先安装该工具包在Linux平台上的依赖
对于Python2

  1. sudo python-xlib

对于Python3

  1. sudo apt-get install python3-Xlib

接着安装pyautogui

  1. sudo pip2 install pyautogui

首先用一个简单的示例来检验一下安装是否正常(移动鼠标的位置)

  1. >>>import pyautogui
  2. >>> screenWidth, screenHeight = pyautogui.size()
  3. >>> pyautogui.moveTo(screenWidth / 2, screenHeight / 2)

如果鼠标指针移动到了电脑屏幕的中间,就说明安装的工具包可以正常工作.

一个有趣的示例:

  1. import pyautogui
  2. screenWidth, screenHeight = pyautogui.size()
  3. currentMouseX, currentMouseY = pyautogui.position()
  4. pyautogui.moveTo(100, 150)
  5. pyautogui.click()
  6. # 鼠标向下移动10像素
  7. pyautogui.moveRel(None, 10)
  8. pyautogui.doubleClick()
  9. # 用缓动/渐变函数让鼠标2秒后移动到(500,500)位置
  10. # use tweening/easing function to move mouse over 2 seconds.
  11. pyautogui.moveTo(1800, 500, duration=2, tween=pyautogui.easeInOutQuad)
  12. # 在每次输入之间暂停0.25秒
  13. pyautogui.typewrite(\'Hello world!\', interval=0.25)
  14. pyautogui.press(\'esc\')
  15. pyautogui.keyDown(\'shift\')
  16. pyautogui.press([\'left\', \'left\', \'left\', \'left\', \'left\', \'left\'])
  17. pyautogui.keyUp(\'shift\')
  18. pyautogui.hotkey(\'ctrl\', \'c\')

这个例子是拖动鼠标在MS paint中绘制方形螺旋形状(任何图形绘制程序都行):
接着

  1. distance = 200
  2. while distance > 0:
  3. pyautogui.dragRel(distance, 0, duration=0.5) # move right
  4. distance -= 5
  5. pyautogui.dragRel(0, distance, duration=0.5) # move down
  6. pyautogui.dragRel(-distance, 0, duration=0.5) # move left
  7. distance -= 5
  8. pyautogui.dragRel(0, -distance, duration=0.5) # move up

结果如下:

一切安全第一_,你写的程序也许会失控哦,尤其是和GUI相关的.为了能够及时中断,PyAutoGUI提供了一个保护措施 : 当pyautogui.FAILSAFE = True时,如果把鼠标光标在屏幕左上角,PyAutoGUI函数就会产生pyautogui.FailSafeException异常。如果失控了,需要中断PyAutoGUI函数,就把鼠标光标在屏幕左上角。要禁用这个特性,就把FAILSAFE设置成False

  1. import pyautogui
  2. pyautogui.FAILSAFE = False

通过把pyautogui.PAUSE设置成floatint时间(秒),可以为所有的PyAutoGUI函数增加延迟。默认延迟时间是0.1秒。在函数循环执行的时候,这样做可以让PyAutoGUI运行的慢一点,非常有用。例如:

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

所有的PyAutoGUI函数在延迟完成前都处于阻塞状态(block).

  • 常用函数
  1. pyautogui.position() #当前鼠标坐标 x , y
  2. pyautogui.size() #当前屏幕的宽,高
  3. pyautogui.onScreen(x,y) #如果(x,y)在屏幕范围内为True
  • 安全
  1. pyautogui.PAUSE = 2.5 #每个PyAutoGUI调用暂停2.5秒

当pyautogui.FAILSAFE = True时,如果把鼠标光标在屏幕左上角,PyAutoGUI函数就会产生pyautogui.FailSafeException异常。

  1. pyautogui.FAILSAFE = True
  • 鼠标相关

坐标系的原点是左上角。X轴(水平)坐标向右增大,Y轴(竖直)坐标向下增大。

  1. num_seconds = 1.2
  2. # 用num_seconds秒的时间把光标移动到(x, y)位置
  3. pyautogui.moveTo(x, y, duration=num_seconds)
  4. # 用num_seconds秒的时间把光标的X轴(水平)坐标移动xOffset,
  5. # Y轴(竖直)坐标向下移动yOffset。
  6. xOffset, yOffset = 50, 100
  7. pyautogui.moveRel(xOffset, yOffset, duration=num_seconds)

click()函数就是让鼠标点击,默认是单击左键,参数可以设置:

  1. pyautogui.click(x=moveToX, y=moveToY, clicks=num_of_clicks, interval=secs_between_clicks, button=\'left\')

其中,button属性可以设置成left,middle和right。

所有的点击都可以用这个函数,不过下面的函数可读性更好:

  1. pyautogui.rightClick(x=moveToX, y=moveToY)
  2. pyautogui.middleClick(x=moveToX, y=moveToY)
  3. pyautogui.doubleClick(x=moveToX, y=moveToY)
  4. pyautogui.tripleClick(x=moveToX, y=moveToY)

scroll函数控制鼠标滚轮的滚动,amount_to_scroll参数表示滚动的格数。正数则页面向上滚动,负数则向下滚动:

  1. pyautogui.scroll(clicks=amount_to_scroll, x=moveToX, y=moveToY)

每个按键按下和松开两个事件可以分开处理:

  1. pyautogui.mouseDown(x=moveToX, y=moveToY, button=\'left\')
  2. pyautogui.mouseUp(x=moveToX, y=moveToY, button=\'left\')
  • 键盘函数
    键盘上可以按的键都可以调用:
  1. # 每次键入的时间间隔
  2. secs_between_keys = 0.1
  3. pyautogui.typewrite(\'Hello world!\n\', interval=secs_between_keys)

多个键也可以:

  1. pyautogui.typewrite([\'a\', \'b\', \'c\', \'left\', \'backspace\', \'enter\', \'f1\'], interval=secs_between_keys)

按键名称列表:

  1. pyautogui.KEYBOARD_KEYS[:10]

键盘的一些热键像Ctrl-S或Ctrl-Shift-1都可以用hotkey()函数来实现:

  1. pyautogui.hotkey(\'ctrl\', \'a\') # 全选
  2. pyautogui.hotkey(\'ctrl\', \'c\') # 复制
  3. pyautogui.hotkey(\'ctrl\', \'v\') # 粘贴

每个按键的按下和松开也可以单独调用:

  1. pyautogui.keyDown(key_name)
  2. pyautogui.keyUp(key_name)
  • 消息弹窗函数
    如果你需要消息弹窗,通过单击OK暂停程序,或者向用户显示一些信息,消息弹窗函数就会有类似JavaScript的功能:
  1. pyautogui.alert(\'这个消息弹窗是文字+OK按钮\')
  2. pyautogui.confirm(\'这个消息弹窗是文字+OK+Cancel按钮\')
  3. pyautogui.prompt(\'这个消息弹窗是让用户输入字符串,单击OK\')

在prompt()函数中,如果用户什么都不输入,就会返回None。

  • 截屏函数
    PyAutoGUI用Pillow/PIL库实现图片相关的识别和操作。

在Linux里面,你必须执行sudo apt-get install scrot来使用截屏特性。

  1. # 返回一个Pillow/PIL的Image对象
  2. pyautogui.screenshot()
  3. pyautogui.screenshot(\'foo.png\')

如果你有一个图片文件想在上面做点击操作,你可以用locateOnScreen()函数来定位。

  1. # 返回(最左x坐标,最顶y坐标,宽度,高度)
  2. pyautogui.locateOnScreen(\'pyautogui/looks.png\')
  3. locateAllOnScreen()函数会寻找所有相似图片,返回一个生成器:
  4. for i in pyautogui.locateAllOnScreen(\'pyautogui/looks.png\'):
  5. print(i)
  6. list(pyautogui.locateAllOnScreen(\'pyautogui/looks.png\'))
  7. locateCenterOnScreen()函数会返回图片在屏幕上的中心XY轴坐标值:
  8. pyautogui.locateCenterOnScreen(\'pyautogui/looks.png\')

如果没找到图片会返回None。定位比较慢,一般得用1~2秒

光标位置记录程序Python 2版本是:

  1. import pyautogui, sys
  2. print(\'Press Ctrl-C to quit.\')
  3. try:
  4. while True:
  5. x, y = pyautogui.position()
  6. positionStr = \'X: \' + str(x).rjust(4) + \' Y: \' + str(y).rjust(4)
  7. print positionStr,
  8. print \'\b\' * (len(positionStr) + 2),
  9. sys.stdout.flush()
  10. except KeyboardInterrupt:
  11. print \'\n\'

更详细信息请访问参考资料中的链接
参考资料

版权声明:本文为taceywong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/taceywong/p/5733134.html