@037
новичок в программировании

Что не так с кодом Python?

Приведенный ниже код должен искать первое изображение и в случае, если он его не находит, выполнять поиск других изображений и кликать по ним.
проблема заключается в том, что после того, как он не находит его в первый раз и прокликивает все найденные изображения он перестает выполнять код. его не сильно заботит то, что он в цикле и выйти из него он тоже не хочет.

Сам код исполняется весь, но в конце пишет 'imgs f done' и после этого он продолжает принтить его же, только уже ничего не делает. это лучше чем то, что было раньше, но я теперь в принципе не понимаю, где он потерялся...

Пример кода:
import pyautogui as pg
import time as t
import cv2
import numpy as np



    mmcfs = 0
    while mmcfs > 1:
        try:
#first.png это то, что надо найти.
            gb8 = pg.locateOnScreen('first.png', region=(0, 0, 450, 970), confidence=0.8)
            pg.moveTo(gb8)
            t.sleep(0.3)
            pg.moveTo(1, 1)
            print('gb8nmc')
            y += 2
            mmcfs += 1
            t.sleep(1)
        except:
# а приведенный ниже цикл должен был выполняться каждый раз, когда first.png был не найден
            while True:
                try:
                    image_path1 = '1.png'
                    image_path2 = '2.png'
                    image_path3 = '3.png'
                    image_path4 = '4.png'
                    image_path5 = '5.png'

                    clicks = 2
                    threshold = 0.7

                    image1 = cv2.imread(image_path1, cv2.IMREAD_GRAYSCALE)
                    image2 = cv2.imread(image_path2, cv2.IMREAD_GRAYSCALE)
                    image3 = cv2.imread(image_path3, cv2.IMREAD_GRAYSCALE)
                    image4 = cv2.imread(image_path4, cv2.IMREAD_GRAYSCALE)
                    image5 = cv2.imread(image_path5, cv2.IMREAD_GRAYSCALE)


                    
                    screenshot = pg.screenshot(region=(0, 0, 450, 970))
                    screenshot = np.array(screenshot)
                    screenshot = cv2.cvtColor(screenshot, cv2.COLOR_RGB2BGR)
                    gray_screenshot = cv2.cvtColor(screenshot, cv2.COLOR_BGR2GRAY)

                    images = [image1, image2, image3]
                    for image in images:
                        result = cv2.matchTemplate(gray_screenshot, image, cv2.TM_CCOEFF_NORMED)
                        locations = np.where(result >= threshold)
                        image_center = (image.shape[1] // 2, image.shape[0] // 2)

                        for pt in zip(*locations[::-1]):
                            center_x = pt[0] + image_center[0]
                            center_y = pt[1] + image_center[1]
                            pg.click(x=center_x, y=center_y, clicks=clicks)
                    t.sleep(3)
                    print('imgs f done')
                    break
                except:
                    print('imgs f failed')
                    t.sleep(1)
  • Вопрос задан
  • 302 просмотра
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Потому что ты неверно понимаешь логику своей программы.
Если у тебя не найдётся 1.png, вылетит исключение, и даже не будут попытки искать дальнейшие картинки - управление перейдёт в except, а затем на новую итерацию while True, где снова будет попытка искать 1.png.

Есть и ещё ряд замечаний.
1. На кой баклажан ты загружаешь 1.png-5.png на каждой итерации цикла? Только зря программу замедляешь. Если ты не хочешь обновлять эти файлы без перезапуска программы, то загрузи их один раз на старте.
2. То же самое со скриншотом. Ты делаешь новый скриншот перед каждым следующим файлом - это точно хорошая идея? Вроде как надо поискать изображения на скриншоте, и только потом делать следующий.
3. Почему ты используешь И locateOnScreen(), И matchTemplate()? Выбери ту функцию, которая лучше работает, и используй только её.
4. Ты нифига не отслеживаешь, а что за исключение-то вылетает? Может, у тебя программа в принципе кривая, и дело не в том, что изображение не найдено. Для locateOnScreen() лови конкретно pyautogui.ImageNotFoundException. matchTemplate() исключений не кидает, так что проверяй, что locations не пуст, а имеет хотя бы один элемент. А остальные эксепшены не лови, или хотя бы выводи инфу о них в журнал работы программы.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы