2016-05-04 5 views
3

Я пытаюсь использовать locateCenterOnScreen() функцию PyAutoGUI, однако она поднимает:Pyautogui TypeError: объект '' NoneType не Iterable

Traceback (most recent call last): 
    File "C:\Users\windows\Desktop\asd.py", line 3, in <module> 
    buttonx, buttony = pyautogui.locateCenterOnScreen('who.jpg') 
TypeError: 'NoneType' object is not iterable 

Мой код:

import pyautogui 

buttonx, buttony = pyautogui.locateCenterOnScreen('who.jpg') 
pyautogui.doubleClick(buttonx,buttony) 

Как исправить Эта проблема?

+0

Убедитесь, что "who.jpg" на самом деле существует. –

+0

@ IgnacioVazquez-Abrams Я сделал.Он существует, и я также поместил полный путь этой картины. Еще одна проблема. – GLHF

+0

* shrug * PyAutoGUI не согласен. –

ответ

6

Из документации Pyautogui here метод locateCenterOnScreen возвращает None, когда он не может найти изображение на экране.

Обратите внимание, что вы ищете 2 результата с помощью этого метода, но None - это всего лишь один результат (так как метод обычно возвращает два, это кажется плохим дизайном для меня - вместо этого он должен вызывать исключение или, по крайней мере, возвращать кортеж с двумя объектами None).

Посмотрите на следующий пример, который является в основном то, что происходит с вами:

>>> foo,bar = None 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'NoneType' object is not iterable 

Самый простой и наиболее Pythonic способ решения этого вопроса, на мой взгляд было бы просто, чтобы попытаться поймать его:

try: 
    buttonx,buttony = pyautogui.locateCenterOnScreen('who.jpg') 
except TypeError: 
    """ Do something to handle the fact that the image was not found""" 

EDIT: Чтобы ответить на ваш вопрос, затронутый в комментариях, кажется, что возникает недоразумение в отношении того, как эта библиотека работает или что она находит на экране. Вы даете библиотеке представление того, что ей нужно найти через какое-то изображение. Он работает намного лучше, когда это изображение без потерь, потому что тогда это точное, пиксельно-пиксельное представление. Затем библиотека выполняет поиск на экране компьютера для фактической вещи, представленной предоставленным изображением. Это не значит, что вы поднимаете проблемы, находите jpeg или png. Он находит фактический визуализированный объект. Итак, если вы сделаете снимок экрана для своего веб-браузера на своем рабочем столе, он найдет фактический значок из этого скриншота и нажмет на него, но только если он будет виден. Если он за другими окнами или чем-то, он не найдет его. Он не ищет экран для файла значка, а сам рендеринг самого значка. Так, например, если вы предоставили фактический файл .ico в библиотеку, он не сможет найти этот значок, если он был закрыт другим окном, хотя этот значок технически на вашем рабочем столе, потому что его нет в настоящее время оказаны.

НТН

+0

Мне нужно найти местоположение этой фотографии, если я поймаю ошибку, я не смогу ее найти. Это не решение для меня, это в основном ошибка. – GLHF

+0

Это точно ошибка. Изображение не отображается на вашем экране, поэтому библиотека возвращает None. Ваш вопрос не был «почему изображение не найдено на моем экране», это было «почему эта ошибка здесь»? И я это прекрасно ответил. – Keozon

+0

Но картинки здесь. Моя цель - найти местоположения изображения, если он вызывает ошибку, тогда нет смысла писать этот скрипт. – GLHF

0

К УПРОЩЕНИЮ вещи - locateCenterOnScreen() метод должен возвращать центр (х, у) координат изображения, как вы назвали «who.jpg» ТОЛЬКО ЕСЛИ ИМЕЕТСЯ НА ЭКРАНЕ , В противном случае, если изображение «who.jpg» не будет отображаться на экране - МЕТОД ДОЛЖЕН ВОЗВРАТИТЬ «НЕТ».

Вы не можете назначить значение «NONE» для координат (x, y), потому что вы получаете одно значение («NONE») и две переменные, ожидающие получения некоторого значения. Вот почему вы получаете «TypeError».

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

ДЛЯ ВАШЕГО УДОБСТВА TRY следующий код:

try: 
    buttonx, buttony = pyautogui.locateCenterOnScreen('who.jpg') 
    pyautogui.click(buttonx, buttony) 
except TypeError: 
    print("A TypeError has been occured!") 
Смежные вопросы