Sikuli脚本编写

1 投票
2 回答
691 浏览
提问于 2025-04-18 14:17

我想写一个sikuli脚本,能够在“回收站”满的时候清空它(第一次执行时),并且需要检查图标,如果回收站是空的,就显示“回收站是空的”。

以下是我尝试过的代码:

尝试1 - 当没有找到“RecycleBin-1.png”这个图像时:--> 这个图像表示“回收站已满” 右键点击“RecycleBin-1.png” --> 右键点击“回收站”满的图标。 点击“EmptyRecycle.png” --> 这是确认删除所有项目的图像。

click("1406033619416.png") --> Image of "Recycle bin" is empty
print ("Recycle bin has been emptied")
else:
while exists ("RecycleBin.png"): 
print ("Recycle bin is already empty")

尝试2 - 当没有找到“RecycleBin-1.png”时: 右键点击“RecycleBin-1.png” 点击“EmptyRecycle.png”

click("1406033619416.png")
print ("Recycle bin has been emptied")
else:
print ("Recycle bin is empty")

我的问题是,无论是while循环之前的else部分被执行(或者)else部分在回收站是空的(或者)满的时候被执行,sikuli似乎没有进行完整的分析,而是按需要执行了。

请大家帮帮我,因为我对sikuli和python还比较陌生。

谢谢,
V.Prashanth

2 个回答

0

autoKarma说得很对,你需要增加相似度;因为垃圾桶图标是静态的,我建议把相似度调到99%。顺便说一下,IDE(集成开发环境)会隐藏下面的文本“.similar(0.##)”,但如果你保存后查看生成的.py文件,它是会存在的。

我对你的循环做了一些调整,根据我使用Sikuli的经验,你会发现需要写很多循环,以确保Sikuli能够处理那些在模式识别中不可避免出现的各种情况。下面的代码是未经测试的,虽然大致适用于Mac,但至少我使用的那台在开始清空之前会弹出一个“你确定要删除吗”的警告,所以你的情况可能会有所不同。

def take_out_the_trash():
    while exists(Pattern("Full_RecycleBin.png").similar(0.99)):
        rightClick("Full_RecycleBin.png")
        wait 1
        while exists(Pattern("EmptyRecycle_Button.png").similar(0.99)):
            click("EmptyRecycle_Button.png")
            wait 1
        while exists (Pattern("Emptying_trash_in_progress.png").similar(0.90)):
             wait 2

take_out_the_trash()

对于“正在清空垃圾桶”的图片,要小心不要把进度条包含在里面;只需找到一些静态的文本或菜单,这样就可以安全地引用。

2

首先,去看看你在Sikuli IDE中代码里图标的图片位置。试着点击一下这个图片,然后去匹配的预览标签,调整相似度,从默认的0.7改成更高的值,比如0.9或者0.95,看看这样能不能解决问题。

因为完整的回收站图标和空的回收站图标非常相似,所以提高相似度可以让Sikuli只在图标几乎完全相同(90%或95%相似)的情况下才匹配,而不是在70%相似的情况下就匹配。

如果这样还不行,可能还有其他方法可以尝试,但我建议你先试试这个。

撰写回答