проблема pyautogui: locateCenterOnScreen не находит нужное местоположение

Я пытаюсь написать простую программу автоматизации работы с кодом locateCenterOnscreen, чтобы найти место для щелчка, выполнить простую работу по щелчку и копированию-вставке и повторить эти задания много раз.

При этом у меня возникла следующая проблема:

Время от времени он работает нормально, но иногда код locateCenterOnScreen находит неправильное место. Если я перезапускаю и очищаю вывод и повторяю попытку, иногда он снова работает нормально, но иногда все еще находит неправильное место.

Он все еще находит какое-то место, поэтому программа работает без ошибок. Но это совершенно неправильное место, на котором нет изображения, так что я не думаю, что это проблема изображения.

Я использую два монитора, может ли это быть проблемой? Если да, то что мне делать, чтобы решить эту проблему?

Я использую Jupyter Notebook, и вот мой код.

import time
import pyautogui as p


def alttab():
    p.keyDown('alt');p.press('tab');p.keyUp('alt')

sku_code = p.locateCenterOnScreen("sku_code.png")
bd_code = p.locateCenterOnScreen("mag.png")
add_to_list = p.locateCenterOnScreen("add_to_list.png")

alttab()

for i in range(10):

    p.hotkey('ctrl', 'c')
    p.moveTo(bd_code);p.moveRel(-30,);p.click()
    p.hotkey('ctrl', 'v');p.press('enter')
    time.sleep(2)

    alttab()
    p.press('right');p.press('right');p.hotkey('ctrl', 'c')

    p.click(sku_code)
    p.hotkey('ctrl', 'a');p.press('delete');p.hotkey('ctrl', 'v');p.press('enter')
    time.sleep(2)

    alttab()
    p.press('right');p.hotkey('ctrl', 'c')

    p.moveTo(add_to_list)
    p.moveRel(7, 45);p.click()
    p.hotkey('ctrl', 'v')
    p.click(add_to_list)
    time.sleep(2)
    error = p.locateCenterOnScreen("error.png")

    # if everything goes fine to this point, it doesn't generate any pop-up, 
    # but if something goes wrong, it would generate a pop-up with "error.png" image.


    if error != None:
        p.press('enter')
        alttab()
        p.press('right');p.press('f2');p.typewrite("error");p.press('enter')
        p.press('left');p.press('left');p.press('left');p.press('left')

    else:
        p.press('enter')
        alttab()
        p.press('right');p.press('f2');p.typewrite("success");p.press('enter')
        p.press('left');p.press('left');p.press('left');p.press('left')

person asiwish0506    schedule 19.02.2020    source источник


Ответы (1)


Привет, кажется, у меня есть ответ на вашу проблему:

  • Вы могли бы использовать более четкое изображение без лишних шумов
    это может быть причиной ваших проблем

  • также вместо использования

     sku_code = p.locateCenterOnScreen("sku_code.png")
    

попробуйте использовать значение достоверности

    sku_code = p.locateCenterOnScreen("sku_code.png", confidence=o.9)

просто убедитесь, что у вас установлен openCV
и если он выдает ошибку, используйте блок try exclude в цикле for while и повторите

def iterate(number_of_iterations, interval)
counter = 0
while counter <= number_of_iterations:
    time.sleep(float(interval))
    try:
        x,y = p.locateCenterOnScreen("sku_code.png", confidence=o.9)
        p.click(x, y)
        break
    except TypeError:
        pass
        counter += 1
person Kush    schedule 28.09.2020