pyautogui.pixel (x, y) начинает отставать в цикле while - PullRequest
0 голосов
/ 30 апреля 2019

Я хочу проверить, когда пиксель на экране меняется, а затем поставить событие клавиатуры, когда пиксель меняет цвета. Но примерно через 2-4 минуты компьютер замедляется, когда pyautogui.pixel() вызывается несколько раз.

Вот мой код

import pyautogui

OldC1 = None

while True:
   NewC1 = pyautogui.pixel(750, 550)

   if NewC1 != OldC1:
      pyautogui.press('up')

   OldC1 = NewC1;

Есть ли способ обойти отставание?

Ответы [ 2 ]

0 голосов
/ 19 мая 2019

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

Если точность времени не требуется, то ярекомендовал бы поставить узкое место в циклах цикла, используя функцию, подобную sleep()

TRY:

from PIL import ImageGrab
import time

OldC1 = (0, 0, 0)

while True:

   time.sleep(.3)
   NewC1 = ImageGrab.grab().getpixel((750, 550))

   if NewC1 != OldC1:
      pyautogui.press('up')

   OldC1 = NewC1

time.sleep(2) уменьшит частотуитерации, и, в свою очередь, приведут к гораздо лучшей производительности в долгосрочной перспективе.

РЕДАКТИРОВАТЬ:

Вместо использования функции пикселей pyautogui, чтобы получитьзначения RGB для определенного пикселя, я скорее использовал модуль getpixel() из PIL (Python Imaging Library), причина в том, что функция pyautogui.pixel() является просто оболочкой ImageGrab.grab().getpixel(), и, поскольку мы стремимся к производительности, мы должны вместо этогоиспользуется getpixel() напрямую, для небольшого повышения производительности.

PS:

pyautogui.pixel() имеет ограничение на общее количество просмотров пикселей, которое составляет где-то около 10 000. Прочитать этот ответ .Это может привести к неверным результатам, если значение поиска превышает 10 000, PIL getpixel() не имеет этого порогового значения.

0 голосов
/ 19 мая 2019

Я сталкивался с подобными проблемами, мой способ обойти эту проблему заключался в прямом использовании функций PIL вместо функций-оболочек pyautogui:

from PIL import ImageGrab

pixelRGB = ImageGrab.grab().getpixel((x, y))

Использование этой функции не замедлило мой компьютер.

...