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?