【问题标题】:pyautogui.pixel(x,y) starts lagging in a while looppyautogui.pixel(x,y) 在 while 循环中开始滞后
【发布时间】:2019-05-20 02:58:12
【问题描述】:

我想检查屏幕上的像素何时改变,然后在像素改变颜色时放置一个键盘事件。但是大约 2-4 分钟后,当pyautogui.pixel() 被多次调用时,计算机会变慢。

这是我的代码

import pyautogui

OldC1 = None

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

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

   OldC1 = NewC1;

有没有办法绕过延迟?

【问题讨论】:

    标签: python pyautogui


    【解决方案1】:

    我也遇到过类似的问题,我的规避方法是直接使用 PIL 的函数,而不是 pyautogui 的封装函数:

    from PIL import ImageGrab
    
    pixelRGB = ImageGrab.grab().getpixel((x, y))
    

    使用此功能并没有降低我的电脑速度。

    【讨论】:

    • 他在一个无限循环中使用这个函数,这会降低他的电脑速度,而不是他获得像素值的模块。
    • 我知道这一点,但我的测试结果显示不同。不知何故,我不知道为什么,在无限循环中运行 pyautogui.pixel() 会显着降低我的 PC 速度,尤其是达到 10.000 调用限制,但 ImageGrab.grab() 根本没有。我已经让它运行超过 50k 次调用,并且与我开始测试时没有性能差异。
    【解决方案2】:

    问题不在于您用来获取值的函数,而在于始终连续运行的无限循环。

    如果不需要时间精度,那么我建议通过类似于sleep()的函数在循环周期上设置瓶颈

    试试:

    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值,而是使用PIL(Python Imaging Library)模块中的getpixel(),原因是pyautogui.pixel()函数只是一个包装器ImageGrab.grab().getpixel(),由于我们追求性能,我们应该直接使用getpixel(),以获得一点性能提升。

    PS:

    pyautogui.pixel() 对总像素查找的限制约为 10,000。 Read This Answer。这可能会导致不正确的结果,如果查找值超过 10,000,PILgetpixel() 没有此阈值。

    【讨论】:

      猜你喜欢
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      • 1970-01-01
      • 2018-08-22
      相关资源
      最近更新 更多