【发布时间】:2014-09-03 17:52:48
【问题描述】:
所以我在与 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])
因此,我需要两件事中的一件:
- 一种在排序后将查找对象转换回字符串的方法
- 一种按图像 y 值对图像进行排序,同时将图像保留为字符串的方法
希望这会有所帮助。
【问题讨论】:
-
我问你想对图像做什么?
find或findAll操作使用模式/图片/屏幕截图或字符串作为输入类型并返回 (a) 匹配对象,通过它您可以完成几乎任何 Sikuli 必须提供的...跨度> -
有很多预先存在的方法需要图像而不是图案。他们每个人都使用 find 方法(以及类似于 find 的自建方法)。我可以加入一些 if 语句来处理这个问题,但这将是很多我不想做的改变。因此,我希望能够将它们转换回图像并将它们发送到方法
-
我不确定我是否清楚 -- 图像和图案有什么区别?在上面的示例中,
icons = findAll(image)这里的“图像”是 Pattern 类型。相比之下,如果您说 `iconNames = findAll("IconTitle"),那么 IconTitle 将是 String 类型。 findAll() 操作接受的唯一两种类型是 Pattern 和 String。你的意思是图案和图像是同一个东西吗? -
对不起,“图像”是指我猜的字符串。所以在我的代码中,我使用了 findAll 方法,它将字符串转换为......无论它变成什么。之后我必须调用的方法也包含 find 方法。但是,由于图像不再是图像/字符串,所以 find 方法不会接受它。换句话说,我正在调用的方法正在尝试这样做:find(findAll(image)) 并且它不喜欢那样。
-
没有看到你的代码,很难说,但你确定你真的需要第二次查找操作吗?无论是您最初寻找的字符串还是模式/图片,通常 find() 只是您想做的任何其他事情的初步。而且因为你已经找到了一次,你可以跳过第二次找到它,直接去做你想做的任何事情。你能发布一些代码吗?