Pyautogui и аварии pyscreeze с windll.user32.ReleaseDC не удалось

голоса
0

Я пытаюсь сравнить некоторые значения пикселей в моем pyautogui сценария, но он выходит из строя с следующим сообщением об ошибке либо нескольких успешных запусков, или иногда просто прямо по первому зову:

Traceback (most recent call last):
  File F:\Koodit\Python\HeroWars NNet\Assets\autodataGet.py, line 219, in <module>
    battle = observeBattle()
  File F:\Koodit\Python\HeroWars NNet\Assets\autodataGet.py, line 180, in observeBattle
    statii = getHeroBattlePixels()
  File F:\Koodit\Python\HeroWars NNet\Assets\autodataGet.py, line 32, in getHeroBattlePixels
    colormatch = pyautogui.pixelMatchesColor(location[0], location[1], alive, tolerance=5)
  File E:\Program Files\Python\lib\site-packages\pyscreeze\__init__.py, line 557, in pixelMatchesColor
    pix = pixel(x, y)
  File E:\Program Files\Python\lib\site-packages\pyscreeze\__init__.py, line 582, in pixel
    return (r, g, b)
  File E:\Program Files\Python\lib\contextlib.py, line 120, in __exit__
    next(self.gen)
  File E:\Program Files\Python\lib\site-packages\pyscreeze\__init__.py, line 111, in __win32_openDC
    raise WindowsError(windll.user32.ReleaseDC failed : return 0)
OSError: windll.user32.ReleaseDC failed : return 0

Мой код (это называется несколько раз, иногда он выходит из строя при первом запуске, иногда это работает хорошо около 100 звонков перед отказом, также, мой экран 4K, поэтому резолюция получить большую):

def getSomePixelStatuses():
    someLocations= [
                        [1200, 990],
                        [1300, 990],
                        [1400, 990],
                        [1500, 990],
                        [1602, 990],
                        [1768, 990],
                        [1868, 990],
                        [1968, 990],
                        [2068, 990],
                        [2169, 990]
                        ]
    status = []
    someValue= (92, 13, 12)
    for location in someLocations:
        colormatch = pyautogui.pixelMatchesColor(location[0], location[1], someValue, tolerance=5)
        status.append(colormatch)
    return status

Я понятия не имею, как смягчить эту проблему. Казалось бы, что pyautogui польз pyscreeze читать значение пикселей на экране, и наиболее вероятный кандидат на место, где происходит ошибка функция pyscreeze пикселей:

def pixel(x, y):
    
    TODO
    
    if sys.platform == 'win32':
        # On Windows, calling GetDC() and GetPixel() is twice as fast as using our screenshot() function.
        with __win32_openDC(0) as hdc: # handle will be released automatically
            color = windll.gdi32.GetPixel(hdc, x, y)
            if color < 0:
                raise WindowsError(windll.gdi32.GetPixel failed : return {}.format(color))
            # color is in the format 0xbbggrr https://msdn.microsoft.com/en-us/library/windows/desktop/dd183449(v=vs.85).aspx
            bbggrr = {:0>6x}.format(color) # bbggrr => 'bbggrr' (hex)
            b, g, r = (int(bbggrr[i:i+2], 16) for i in range(0, 6, 2))
            return (r, g, b)
    else:
        # Need to select only the first three values of the color in
        # case the returned pixel has an alpha channel
        return RGB(*(screenshot().getpixel((x, y))[:3]))

Я установил эти библиотеки только вчера, и я бегу питона 3.8 на Windows 10, и pyscreeze является версия 0.1.25 так в теории все должно быть в курсе, но как-то что-то концы вверх разбивая. Есть ли способ, чтобы смягчить это, либо модифицировать свой код, или даже библиотека себя, или это моя среда не подходит для этой работы?

Задан 02/12/2019 в 23:54
источник пользователем
На других языках...                            


1 ответов

Pyautogui и аварии pyscreeze с windll.user32.ReleaseDC не удалось

голоса
0

Я пытаюсь сравнить некоторые значения пикселей в моем pyautogui сценария, но он выходит из строя с следующим сообщением об ошибке либо нескольких успешных запусков, или иногда просто прямо по первому зову:

Traceback (most recent call last):
  File "F:\Koodit\Python\HeroWars NNet\Assets\autodataGet.py", line 219, in <module>
    battle = observeBattle()
  File "F:\Koodit\Python\HeroWars NNet\Assets\autodataGet.py", line 180, in observeBattle
    statii = getHeroBattlePixels()
  File "F:\Koodit\Python\HeroWars NNet\Assets\autodataGet.py", line 32, in getHeroBattlePixels
    colormatch = pyautogui.pixelMatchesColor(location[0], location[1], alive, tolerance=5)
  File "E:\Program Files\Python\lib\site-packages\pyscreeze\__init__.py", line 557, in pixelMatchesColor
    pix = pixel(x, y)
  File "E:\Program Files\Python\lib\site-packages\pyscreeze\__init__.py", line 582, in pixel
    return (r, g, b)
  File "E:\Program Files\Python\lib\contextlib.py", line 120, in __exit__
    next(self.gen)
  File "E:\Program Files\Python\lib\site-packages\pyscreeze\__init__.py", line 111, in __win32_openDC
    raise WindowsError("windll.user32.ReleaseDC failed : return 0")
OSError: windll.user32.ReleaseDC failed : return 0

Мой код (это называется несколько раз, иногда он выходит из строя при первом запуске, иногда это работает хорошо около 100 звонков перед отказом, также, мой экран 4K, поэтому резолюция получить большую):

def getSomePixelStatuses():
    someLocations= [
                        [1200, 990],
                        [1300, 990],
                        [1400, 990],
                        [1500, 990],
                        [1602, 990],
                        [1768, 990],
                        [1868, 990],
                        [1968, 990],
                        [2068, 990],
                        [2169, 990]
                        ]
    status = []
    someValue= (92, 13, 12)
    for location in someLocations:
        colormatch = pyautogui.pixelMatchesColor(location[0], location[1], someValue, tolerance=5)
        status.append(colormatch)
    return status

Я понятия не имею, как смягчить эту проблему. Казалось бы, что pyautogui польз pyscreeze читать значение пикселей на экране, и наиболее вероятный кандидат на место, где происходит ошибка функция pyscreeze пикселей:

def pixel(x, y):
    """
    TODO
    """
    if sys.platform == 'win32':
        # On Windows, calling GetDC() and GetPixel() is twice as fast as using our screenshot() function.
        with __win32_openDC(0) as hdc: # handle will be released automatically
            color = windll.gdi32.GetPixel(hdc, x, y)
            if color < 0:
                raise WindowsError("windll.gdi32.GetPixel failed : return {}".format(color))
            # color is in the format 0xbbggrr https://msdn.microsoft.com/en-us/library/windows/desktop/dd183449(v=vs.85).aspx
            bbggrr = "{:0>6x}".format(color) # bbggrr => 'bbggrr' (hex)
            b, g, r = (int(bbggrr[i:i+2], 16) for i in range(0, 6, 2))
            return (r, g, b)
    else:
        # Need to select only the first three values of the color in
        # case the returned pixel has an alpha channel
        return RGB(*(screenshot().getpixel((x, y))[:3]))

Я установил эти библиотеки только вчера, и я бегу питона 3.8 на Windows 10, и pyscreeze является версия 0.1.25 так в теории все должно быть в курсе, но как-то что-то концы вверх разбивая. Есть ли способ, чтобы смягчить это, либо модифицировать свой код, или даже библиотека себя, или это моя среда не подходит для этой работы?

Ответил 02/12/2019 в 23:54
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more