Pyautogui a pyscreeze crash s windll.user32.ReleaseDC selhal

hlasů
0

Snažím se srovnat určité hodnoty obrazových bodů v mém pyautogui scénář, ale došlo ke zhroucení s následující chybová zpráva ani po několika úspěšných pokusů, nebo někdy jen rovně na první výzvu:

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

Můj kód (to se nazývá vícekrát, někdy dojde k chybě při prvním spuštění, někdy to běží dobře asi na 100 hovorů před nedaří, také, je obrazovka 4K, tak rezoluce dostat big):

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

Nemám ponětí, jak zmírnit tento problém. Mohlo by se zdát, že pyautogui prvků užití pyscreeze číst hodnoty obrazových bodů na obrazovce a nejpravděpodobnější kandidát na místo, kde dojde k chybě, je tato funkce pyscreeze pixel:

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]))

Nainstaloval jsem tyto knihovny teprve včera, a běžím Python 3.8 na Windows 10 a pyscreeze je ve verzi 0.1.25, takže teoreticky všechno by mělo být aktuální, ale nějak končí něco shazovat. Existuje způsob, jak zmírnit to buď úpravou můj kód, nebo dokonce knihovna sama, nebo je můj životní prostředí není vhodný pro tuto operaci?

Položena 02/12/2019 v 23:54
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

Pyautogui a pyscreeze crash s windll.user32.ReleaseDC selhal

hlasů
0

Snažím se srovnat určité hodnoty obrazových bodů v mém pyautogui scénář, ale došlo ke zhroucení s následující chybová zpráva ani po několika úspěšných pokusů, nebo někdy jen rovně na první výzvu:

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

Můj kód (to se nazývá vícekrát, někdy dojde k chybě při prvním spuštění, někdy to běží dobře asi na 100 hovorů před nedaří, také, je obrazovka 4K, tak rezoluce dostat big):

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

Nemám ponětí, jak zmírnit tento problém. Mohlo by se zdát, že pyautogui prvků užití pyscreeze číst hodnoty obrazových bodů na obrazovce a nejpravděpodobnější kandidát na místo, kde dojde k chybě, je tato funkce pyscreeze pixel:

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]))

Nainstaloval jsem tyto knihovny teprve včera, a běžím Python 3.8 na Windows 10 a pyscreeze je ve verzi 0.1.25, takže teoreticky všechno by mělo být aktuální, ale nějak končí něco shazovat. Existuje způsob, jak zmírnit to buď úpravou můj kód, nebo dokonce knihovna sama, nebo je můj životní prostředí není vhodný pro tuto operaci?

Odpovězeno 02/12/2019 v 23:54
zdroj uživatelem

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