Pyautogui e acidente pyscreeze com windll.user32.ReleaseDC falhou

votos
0

Eu estou tentando comparar certos valores de pixel no meu script pyautogui, mas ele trava com seguinte mensagem de erro depois de tanto várias execuções de sucesso, ou às vezes apenas em linha reta na primeira chamada:

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

Meu código (isso é chamado várias vezes, às vezes ele falha na primeira execução, às vezes corre bem para cerca de 100 chamadas antes de falhar, também, minha tela é 4K, então as resoluções ficar grande):

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

Eu não tenho nenhuma idéia de como mitigar este problema. Parece que os usos pyautogui pyscreeze para ler valores de pixels na tela, e mais provável candidato para o lugar onde o erro ocorre é a função de pixel 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]))

Eu instalei essas bibliotecas ontem, e eu estou correndo python 3.8 no Windows 10, e pyscreeze é a versão 0.1.25 portanto, em teoria tudo deve ser atualizado, mas de alguma forma algo extremidades falhando. Existe uma maneira de atenuar este, quer modificar meu código, ou mesmo a biblioteca em si, ou é o meu ambiente não é adequado para esta operação?

Publicado 02/12/2019 em 23:54
fonte usuário
Em outras línguas...                            


1 respostas

Pyautogui e acidente pyscreeze com windll.user32.ReleaseDC falhou

votos
0

Eu estou tentando comparar certos valores de pixel no meu script pyautogui, mas ele trava com seguinte mensagem de erro depois de tanto várias execuções de sucesso, ou às vezes apenas em linha reta na primeira chamada:

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

Meu código (isso é chamado várias vezes, às vezes ele falha na primeira execução, às vezes corre bem para cerca de 100 chamadas antes de falhar, também, minha tela é 4K, então as resoluções ficar grande):

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

Eu não tenho nenhuma idéia de como mitigar este problema. Parece que os usos pyautogui pyscreeze para ler valores de pixels na tela, e mais provável candidato para o lugar onde o erro ocorre é a função de pixel 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]))

Eu instalei essas bibliotecas ontem, e eu estou correndo python 3.8 no Windows 10, e pyscreeze é a versão 0.1.25 portanto, em teoria tudo deve ser atualizado, mas de alguma forma algo extremidades falhando. Existe uma maneira de atenuar este, quer modificar meu código, ou mesmo a biblioteca em si, ou é o meu ambiente não é adequado para esta operação?

Respondeu 02/12/2019 em 23:54
fonte usuário

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