Pyautogui og pyscreeze krasj med windll.user32.ReleaseDC mislyktes

stemmer
0

Jeg prøver å sammenligne visse pikselverdier i min pyautogui script, men det krasjer med følgende feilmelding når enten flere vellykkede løper, eller noen ganger bare rett på den første samtalen:

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

Koden min (dette kalles flere ganger, noen ganger er det krasjer på første løp, noen ganger går det pent for rundt 100 samtaler før mislykkes, også, er min skjerm 4K, så de vedtak som får stor):

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

Jeg har ingen anelse om hvordan å redusere dette problemet. Det synes som pyautogui bruksområder pyscreeze å lese pikselverdier på skjermen, og mest sannsynlig kandidat til stedet der feilen oppstår er pyscreeze pixel funksjon:

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

Jeg installerte disse bibliotekene i går, og jeg kjører python 3.8 på Windows 10, og pyscreeze er versjon 0.1.25 så i teorien alt skal være oppdatert, men en måte noe ender opp med å krasje. Er det en måte å redusere dette, enten å endre koden min, eller til og med selve biblioteket, eller er min miljøet ikke egnet for denne operasjonen?

Publisert på 02/12/2019 klokken 23:54
kilden bruker
På andre språk...                            


1 svar

Pyautogui og pyscreeze krasj med windll.user32.ReleaseDC mislyktes

stemmer
0

Jeg prøver å sammenligne visse pikselverdier i min pyautogui script, men det krasjer med følgende feilmelding når enten flere vellykkede løper, eller noen ganger bare rett på den første samtalen:

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

Koden min (dette kalles flere ganger, noen ganger er det krasjer på første løp, noen ganger går det pent for rundt 100 samtaler før mislykkes, også, er min skjerm 4K, så de vedtak som får stor):

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

Jeg har ingen anelse om hvordan å redusere dette problemet. Det synes som pyautogui bruksområder pyscreeze å lese pikselverdier på skjermen, og mest sannsynlig kandidat til stedet der feilen oppstår er pyscreeze pixel funksjon:

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

Jeg installerte disse bibliotekene i går, og jeg kjører python 3.8 på Windows 10, og pyscreeze er versjon 0.1.25 så i teorien alt skal være oppdatert, men en måte noe ender opp med å krasje. Er det en måte å redusere dette, enten å endre koden min, eller til og med selve biblioteket, eller er min miljøet ikke egnet for denne operasjonen?

Svarte 02/12/2019 kl. 23:54
kilden bruker

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