Question

I am attempting to find objects on the screen, see if they exist, and if so, select them. Using the Sikuli library to run this little automation.

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

I get SyntaxError: mismatched input 'or' expecting RPARENa I've done a quick search but there is nothing I saw relevant to my particular issue.

I've even tried

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

And that results in the same error.

@Stephan: New code snippet with error.

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

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

The Error now, :

NameError: name 'imageFiles' is not defined
Was it helpful?

Solution

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

Your while loop isn't doing anything, and neither is your break statement. This might do what you want, assuming I understand what you want to do.

OTHER TIPS

After reading a little of the Sikuli docs, I think this might also do what you want.

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

Even easier, this is a perfect use of filter(ifexist,imageFiles). You then know that all >=0 elements in the return of filter can be used :). And it's more concise and clearly conveys your intent - much nicer to read then a chain of for's and if's

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

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

Also the or is a logical operator:

e.g.

a = 5
b = 6
c = 5

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

# c is repeated

your use of the or here makes no sense as it doesn't have operands to operate on - these can even be two objects, e.g.

1 or 2 since anything can be cast to a boolean

a concise way to do what you want is: //imagepaths = your list of imagepaths

map(lambda x: click(x.getTarget()), filter(exists, imagepaths))
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top