Sikuli:多图标排序

2024-09-30 01:26:58 发布

您现在位置:Python中文网/ 问答频道 /正文

目标:点击页面中的所有“星星”,方法是先移动锡库里的行,再移动列

例如:恒星排列在一个网格中,如下所示:

* * * * *
* * * * *
* * * * *
* * * * *

编辑:点击顺序如下:

^{pr2}$

首先点击左上角的那个,然后点击右边的星,以此类推。下一步到第二行的左上角,重复。在

我的当前代码:

def by_x(match):
    return match.x
def by_y(match):
    return match.y
stars = findAll("imgOfStar")
sorted_stars_x = sorted(stars, key=by_x)
sorted_stars_y = sorted(stars, key=by_y)
for icon in sorted_stars_x:
    for icon2 in sorted_stars_y:
        click("imgOfStar")

Tags: 方法keyin网格编辑目标forby
2条回答

这也许不是最优雅的方式,但我首先想到的是:

def by_y(match):
    return match.y
stars = findAll(imageOfStars)
sorted_stars_y = sorted(stars, key=by_y)
finalStars = []
count = 0
for x in range(5): #if you know your grid is 5x5
    finalStars.append(sorted(sorted_stars_y[count:count + 5])) #see explanation, if needed
    count += 5
for x in finalStars:
    click(x)

说明:你的例子中的前五颗星应该有匹配的y值,也就是说,它们都应该是最上面的一行。现在,您只需对它们的x值进行排序,并将它们附加到一个列表中,然后转到下一个5,依此类推。在

如果事先不知道网格的大小,可以用几种不同的方法来实现 如果你的网格总是完全平方的,你可以找到你的星数的平方根:

^{pr2}$

如果您的网格不是完全方正的,您还可以做一些其他的事情,但除非这是您要寻找的,否则这个答案会变得有点长,所以我们将把这个讨论留到后面:)

编辑: 由于您知道列数始终为5,因此可以找到如下所示的行数:

 rows = (len(stars) / 5)
 rowCount = 0
 count = 0

然后,您可以使用while循环遍历您的星:

while rowCount < rows:
    finalStars.append(sorted(sorted_Stars_y[count:count+ 5]))
    count += 5
    rowCount += 1

说到底,这会帮你完成任务,@Tenzin的回答更优雅:)

你可以给自己下个定义,明确你喜欢怎样在星空中移动。 屏幕本身有一个x.y位置。从左上角开始,右下角结束,你需要 match.y,match.x

那你需要找到一个星星.png)星星。 你去整理的那些星星,按照你定义的顺序。在

然后使用for循环来处理星星。在

示例代码:

class Stars():
     def order(match):
          return match.y, match.x
     # Find all icons 
     icons = findAll("stars.png")
     # Sort all the stars. 
     sorted_icons = sorted(icons, key=order)
     # Click on every star. 
     for icon in sorted_icons:
          click(icon)

相关问题 更多 >

    热门问题