0

我正在尝试在屏幕上查找对象,查看它们是否存在,如果存在,请选择它们。使用 Sikuli 库来运行这个小自动化。

while True:
    if exist("image/one.png", "image/two.png", "image/three.png"):
        click ("image/one.png", or "image/two.png", or "image/three.png")
    break

我得到SyntaxError: mismatched input 'or' expecting RPAREN了一个我已经完成了快速搜索,但我没有看到与我的特定问题相关的任何内容。

我什至试过

while True:
        if exist("image/one.png", or "image/two.png", or "image/three.png"):
            click ("image/one.png", or "image/two.png", or "image/three.png")
        break

这会导致同样的错误。

@Stephan:有错误的新代码片段。

class gameImages():
    imageFiles = ["one.png", "two.png", "three,png"]

for imageFile in imageFiles:
    if exists(imageFile):
        click(imageFile)

现在的错误,:

NameError: name 'imageFiles' is not defined
4

3 回答 3

1
for imageFile in imageFiles:
  if exists(imageFile):
    click(imageFile)

你的while循环没有做任何事情,你的break陈述也没有。假设我了解您想要做什么,这可能会做您想做的事。

于 2013-07-25T20:37:53.690 回答
0

更简单的是,这是对 filter(ifexist,imageFiles) 的完美使用。然后您知道可以使用过滤器返回中的所有> = 0元素:)。而且它更简洁,更清楚地传达了你的意图——比一连串的 for 和 if 更容易阅读

a = range(10)
# [1,2,3,4,5,6,7,8,9]

print filter(lambda x: x > 5, a)
# [6,7,8,9]

or 也是一个逻辑运算符:

例如

a = 5
b = 6
c = 5

if( (a==c) or (b==c) ):
    print 'c is repeated'

# c is repeated

您在此处使用 or 没有任何意义,因为它没有可操作的操作数——它们甚至可以是两个对象,例如

1 或 2,因为任何东西都可以转换为布尔值

做你想做的一个简洁的方法是://imagepaths =你的imagepaths列表

map(lambda x: click(x.getTarget()), filter(exists, imagepaths))
于 2013-07-25T20:45:23.483 回答
0

在阅读了一些 Sikuli 文档之后,我认为这可以满足您的需求。

for impath in ("image/one.png", "image/two.png", "image/three.png"):
    match = exists(impath)
    if match:
        click(match.getTarget())
于 2013-07-25T20:51:12.243 回答