排序后,将迭代器对象从findAll转换为Sikuli中的图像

时间:2014-09-03 17:52:49

标签: sorting jython sikuli

所以我在与Sikuli合作时遇到了问题。存在多次出现图像的情况。要抓住所有这些,你可以简单地做一个findAll,但它将每个图像保存为某种对象,而不是图像。我知道你可以使用getLastMatches()来获取图像,但我想先对它进行排序。所以这里是我获得的代码,它可以抓取所有图像并对其进行排序。我找到了关于Sikuli文档的一些信息

def by_y(match):
  return match.y

icons = findAll(image)
sorted_icons = sorted(icons, key=by_y)

但问题是,sorted_icons包含一堆可迭代对象(至少是我看到它们所称的那些),而不是图像。有没有办法在保持新列表排序的同时恢复图像?使用getLastMatches()给出原始未排序列表的列表。

此外,它是Sikuli 1.0.1。

感谢。

这应该说明问题(希望如此)。为了按y值对图像进行排序,我必须使用findAll()操作(如果有一种方法可以在不使用find的情况下执行此操作,请分享)。但是,这会从字符串中转换图像,即:

"imagename.png"

进入......以及这是什么(匹配?):

M[8,1045 37x28]@S(S(0)[0,0 1920x1080]) S:1.00 Center:26,1059

self.assets.getimage(image)函数需要一个字符串,所以(所以是imagename.png)而不是你使用find时得到的时髦的东西。

def exampleMethod(image, dx=0, dy=0):
    click(Pattern(self.assets.getimage(image)).targetOffset(dx, dy))

def by_y(match):
  return match.y

image = "imagename.png"
icons = findAll(image)
sorted_icons = sorted(image, key=by_y)

exampleMethod(sorted_icons[0])

因此,我需要两件事中的一件:

  1. 一种将查找对象转换回字符串后排序的方法
  2. 一种按照y值对图像进行排序同时将图像保持为字符串的方法
  3. 希望这有帮助。

2 个答案:

答案 0 :(得分:0)

我不确定这会特别回答你的问题,但我认为有更直接的方式来实现你的目的。

您的exampleMethod()重复了内置的click()功能 -

click()会点击模式,字符串,位置,区域或(最重要的是这个问题)匹配得很好,所以你不需要图像回来点击它。您也不需要self.assets.getimage()来访问要单击的图像。 click()函数首先隐式执行find()操作,然后点击它找到的任何内容。由于您将点击匹配对象,它将转到匹配对象提供的坐标,然后单击这些坐标。

此外,默认.targetOffset是(0,0)(意味着它将点击找到的图像的中心)。因此,您可能不需要在exampleMethod()中预先定义为0。

总而言之,如果页面上有相同图像的多个相同副本,并且您想按顺序点击每个副本,则可以执行以下操作:

icons = list([x for x in findAll(image)]) #cast matches from the findAll() into a list 
sorted_icons = sorted(icons, key=by_y) #note 'icons' here and not 'image'
for icon in sorted_icons:  
    click(icon)
    #anything else you want to do with them

另一种方法,不使用Python的列表理解(如果你不熟悉的话):

findAll(images)
icons = getLastMatches()
sorted_icons = sorted(icons, key=by_y)
listOfSortedIcons = []
while sorted_icons.hasNext():
    listOfSortedIcons.append(sorted_icons.next())
for icon in listOfSortedIcons:
    click(icon)
    #whatever else...

答案 1 :(得分:0)

只是一个简短的信息。 JePySi不处理图标/图像的动态分配。这需要通过Sikuli功能完全实现。所以autoKarma是正确的self.assets.getImage()在这种情况下是无用的,因为它只访问预先注册的图像,这些图像仅通过名称来寻址。因此只有字符串操作。

干杯,   亚历克斯 - 我写了JePySi: - )