从多个变量中选择

时间:2013-07-25 20:25:13

标签: python sikuli

我试图在屏幕上找到对象,看看它们是否存在,如果存在,请选择它们。使用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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

更简单,这是过滤器的完美使用(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]

也是逻辑运算符:

e.g。

a = 5
b = 6
c = 5

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

# c is repeated

你对这里的使用毫无意义,因为它没有操作的操作数 - 这些甚至可以是两个对象,例如。

1或2,因为anything可以强制转换为布尔值

一种简洁的方式来做你想要的是: // imagepaths =您的图像路径列表

map(lambda x: click(x.getTarget()), filter(exists, imagepaths))

答案 2 :(得分:0)

在阅读了一些Sikuli文档之后,我认为可能也可以做你想做的事。

for impath in ("image/one.png", "image/two.png", "image/three.png"):
    match = exists(impath)
    if match:
        click(match.getTarget())