2015-01-14 7 views
1

목적 :는 Sikuli먼저 다음 행을 통해 열을 이동하여 페이지에있는 모든 "별"을 클릭합니다Sikuli : 정렬 여러 아이콘

예 : 별 그리드와 같은 배열되어 그래서 :

* * * * * 
* * * * * 
* * * * * 
* * * * * 

편집 :

1 2 3 4 5 
6 7 8 9 10 
11 12 13 14 15 
16 17 18 19 20 
21 22 23 24 25 
:
이는 클릭 할 수있는 순서는

먼저 왼쪽 상단의 별을 클릭하고 오른쪽의 별 등을 클릭하십시오. 다음으로 두 번째 행의 상단 왼쪽 스타로 가서 반복하십시오.

내 현재 코드 :

def by_x(match): 
    return match.x 
def by_y(match): 
    return match.y 
stars = findAll("imgOfStar") 
sorted_stars_x = sorted(stars, key=by_x) 
sorted_stars_y = sorted(stars, key=by_y) 
for icon in sorted_stars_x: 
    for icon2 in sorted_stars_y: 
     click("imgOfStar") 

답변

1

이 가장 우아한 방법으로되지 않을 수도 있습니다,하지만 그것은 내가 생각할 수있는 최초의 일이다 :

def by_y(match): 
    return match.y 
stars = findAll(imageOfStars) 
sorted_stars_y = sorted(stars, key=by_y) 
finalStars = [] 
count = 0 
for x in range(5): #if you know your grid is 5x5 
    finalStars.append(sorted(sorted_stars_y[count:count + 5])) #see explanation, if needed 
    count += 5 
for x in finalStars: 
    click(x) 

설명 : 귀하의 예제에서 처음 다섯 개의 별 일치하는 y 값을 가져야합니다. 즉, 모두 맨 위 행이어야합니다. 이제 x 값을 정렬하고 목록에 추가 한 다음 다음 5 단계로 이동하는 등의 작업을 수행 할 수 있습니다.

그리드의 크기가 손 전에 알 수없는 경우, 당신은 달성 할 수있는이 몇 가지 ways-- 그리드는 항상 완벽하게 사각형 인 경우에는 별 전화 번호의 제곱근 찾을 수 :

import math #or import sqrt from math, if the square root is the only math function you need. 
def by_y(match): 
    return match.y 
stars = findAll(imageOfStars) 
sorted_stars_y = sorted(stars, key=by_y) 
finalStars = [] 
count = 0 
rows = math.sqrt(len(stars)) 
for x in range(rows): 
    finalStars.append(sorted(sorted_stars_y[count:count + rows])) 
    count += rows 

격자가 완벽하지 않은 경우 수행 할 수있는 다른 작업이 있지만 찾으려하지 않는 한이 답변은 약간 길어 졌으므로 나중에 토론을 저장합니다 :)

편집 : 열의 수는 항상 5이므로, 이 같은 행의 :

rows = (len(stars)/5) 
rowCount = 0 
count = 0 

그런 다음 당신이 당신의 별을 반복하는 while 루프를 사용할 수 있습니다 모두가 말하고 완료되면

while rowCount < rows: 
    finalStars.append(sorted(sorted_Stars_y[count:count+ 5])) 
    count += 5 
    rowCount += 1 

,이 작업이 당신을 위해 일하지만, 얻을 것이다 @Tenzin의 답이 더 우아합니다 :)

+0

감사, 대답합니다. 그러나 나는 행의 수를 모른다. 나는 열의 수인 5 개만 알고있다. – WhiteFlameAB

1

별을 어떻게 움직일 지 명확하게 정의 할 수 있습니다. 화면 자체의 가로 위치는 x.y입니다. 상단 왼쪽부터 시작하여 하단 오른쪽에서 끝내려면 match.y, match.x가 필요합니다.

그러면 별을 찾을 필요가 있습니다 ("별 .png"). 그 별들은 정의한 순서대로 정렬됩니다.

그런 다음 for 루프를 사용하여 별을 사용하여 작업을 수행합니다.

예제 코드 :

class Stars(): 
    def order(match): 
      return match.y, match.x 
    # Find all icons 
    icons = findAll("stars.png") 
    # Sort all the stars. 
    sorted_icons = sorted(icons, key=order) 
    # Click on every star. 
    for icon in sorted_icons: 
      click(icon)