在Python中使用Sikuli

关于Sikuli

Sikuli 是由 MIT 的研究团队发布的新型图形化编程技术。它以图像检索技术为基础,提供了一套基于 Jython 的脚本语言以及集成开发环境。使用者可利用屏幕截图直接引用 GUI 元素进行编程,完成交互操作。Sikuli 一词取自墨西哥 Huichol Indian 土著语,意为“上帝之眼”, Sikuli 让电脑能像人一样“看”这个“真实世界”。

通过Sikuli自带的IDE,操作简单,容易上手,可以编写出非常具备可读性的代码。

使用起来,也有一些不足:

  • 没有代码提示,要一边翻看api,一边写
  • 调试功能比较弱
  • 无法在现有的代码里边,直接集成sikuli的功能

也试过用Eclipse+Pydev来导入sikuli的jar包,使用jython驱动,但因为现有的代码都是在python下编写的,所以这个方式虽然可以脱离Sikuli的IDE,但是并不理想。

Sikuli in Python

直到前几天逛Github,发现了sikuli_cpython这个项目,启发了我,原理是pyjnius提供了可以从Python中直接访问java类的功能,通过它,实现了对Sikuli的jar包的一层封装。

先看看pyjnius的一个官方例子:

1
2
3
4
5
6
7
8
9
10
11
12
>>>from jnius import autoclass
>>> autoclass('java.lang.System').out.println('Hello world')
Hello world
>>> Stack = autoclass('java.util.Stack')
>>> stack = Stack()
>>> stack.push('hello')
>>> stack.push('world')
>>>print stack.pop()
world
>>>print stack.pop()
hello

开始动手~

开发环境:Python2.7+Win10+Pycharm

相关依赖

  • Cython
  • pyjnius
  • JDK

环境变量需要配置JAVA_HOME

Path里边,需要加入jvm.dll所在目录

效果展示

例子1:把图标拖动到文件夹中,最后高亮这个文件夹,并双击它。

1
2
3
4
5
6
7
from sikulitool.sikuli import *
s = Screen()
s.dragDrop("as.png", "dir.png")
s.sleep(0.5)
s.dragDrop("qq.png", "dir.png")
s.find("dir.png").highlight().sleep(1).doubleClick()

例子2:通过similar方法设置相似度,默认是0.7,在屏幕中查找多个相似度为50%的对象,并依次高亮,移动到上边。

1
2
3
4
5
from sikulitool.sikuli import *
s = Screen()
for i in s.findAll(Pattern('doc.png').similar(0.5)):
i.highlight().sleep(1).hover()

源码已在Github,欢迎围观~