Pyautogui - locateonscreen

0

Cześć, mam małe zapytanie dla speców pythona i biblioteki pyautogui może ktoś już miał takowy problem i wie jak rozwiązać.

Chciałbym wykorzystać bibliotekę pyautogui a dokładniej locateOnScreen.
Problem polega na tym że chcę aby skrypt wyszukał nie jeden a kilka obrazków i dał informację czy któryś z nich jest znaleziony i jeśli tak to wykonał odpowiednią akcję.

Zrobiłem skrypt aby sprawdzał instrukcjami warunkowymi każde jedno zdjęcie ale zajmuje to mnóstwo kodu (z 300 linijek) a jest to zaledwie 10-12% wszystkich sprawdzanych zdjęć. Cały skrypt ukończony będzie zajmował mnóstwo miejsca i przede wszystkim bardzo spowolni swoją pracę więc pomyślałem że nie może się to tak odbywać.

Czy jest możliwość aby program sprawdzał listę np 5 zdjęć i w zależności od tego czy znajdzie czy nie to wykonywał jakąś akcję??????????

Trochę kodu:

import pyautogui

zestawzdjec1 = ['zdjecia/1k.png','zdjecia/2k.png','zdjecia/3k.png','zdjecia/4k.png','zdjecia/5k.png']

for i in range(1000):
    print('Kolejka:', i, 'z 1000')
    znalezionyprzycisk = pyautogui.locateOnScreen(zestawzdjec1)
    if znalezionyprzycisk is None:
        print('Nie znaleziono przycisku')
    else:
        print('Znaleziono przycisk!')

Powyższy kod działa tylko w przypadku gdy "zestawzdjec1" ma określone jedno zdjęcie, w przypadku gdy tak jak powyżej ma ich kilka wyrzuca błąd:
AttributeError: 'list' object has no attribute 'mode'

Nie kumam zupełnie dlaczego nie mogę sprawdzać kilku zdjęć ale wierzę że da się to zrobić tak jakbym chciał. Pozdrawiam!

1

Zamiast przekazywac cala liste do funkcji to przeiteruj sie przez liste i probuj dla pojedynczego zdjecia to wywolywac

for img in imgset:
    pyautogui.locateOnScreen(img)
0

Hm pomysł super tylko nie potrafię teraz tego przerobić że w przypadku gdy warunek zostanie spełniony i któryś z tego zestawu zostanie znaleziony to nie szuka już kolejnych obrazków z kolejki tylko wykonuje akcje i idzie dalej. Mógłbyś mi z tym pomóc?

1
found = False
res = None
for img in imgset:
    try:
        res = pyautogui.locateOnScreen(img)
        (...)
        found = True
        break
    except:
         pass

if found:
    (...)

Kod generyczny, moze nie dzialac ale obrazuje sposob

0

Wygląda bardzo przyzwoicie, otworzyłeś mi oczy pisząc już o samej iteracji a teraz to już bardzo mocno, uprzejmie dziękuję i biorę się za robotę. Jak uda mi się to ogarnąć to wklepię tutaj ogarnięty kod, może komuś w przyszłości się przyda!

0

Udało się ogarnąć

Kod: może komuś się przyda:

    for obrazek in imgset:
        try:
            obrazek1 = pyautogui.locateOnScreen(obrazek)
            if obrazek1 is not None:
                print('Znaleziono!.')
                break
            else:
                continue
        except:
                pass

Teraz chciałbym pójść dalej i pytanie moje następne zadane zostanie w nowym temacie :)! Pozdro!

0

Jesli nie udalo sie zlokalizowac danej bitmapy na ekranie to pyautogui rzuca wyjatkiem. Stad ten try-catch. Ale to znaczy, ze ten if w srodku try zawsze bedzie spelniony (nigdy nie bedzie None).

Kolejne sprawa: masz jakies dziwne suffixy (obrazek1, zestawzdjec1). Widze, ze cos tutaj w "architekturze" jest nie tak i powinienes wykorzystac listy/slowniki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1