Pyautogui en pyscreeze crash met windll.user32.ReleaseDC is mislukt

stemmen
0

Ik ben op zoek naar bepaalde pixel waarden te vergelijken in mijn pyautogui script, maar het crasht met de volgende foutmelding na ofwel meerdere succesvolle runs, of soms gewoon rechtdoor op de eerste gesprek:

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

Mijn code (dit wordt meerdere malen genoemd, soms crasht op de eerste run, soms loopt het mooi voor ongeveer 100 oproepen alvorens het als mislukt, ook, mijn scherm is 4K, zodat de resoluties groot worden):

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

Ik heb geen idee hoe dit probleem te verminderen. Het lijkt erop dat pyautogui gebruik pyscreeze om pixelwaarden op het scherm, en de meest waarschijnlijke kandidaat te lezen voor de plaats waar de fout zich voordoet is de pyscreeze pixel-functie:

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

Ik installeerde deze bibliotheken gisteren, en ik ben bijna python 3.8 op Windows 10, en pyscreeze is versie 0.1.25 dus in theorie alles moet worden to-date, maar een of andere manier iets gaan crashen. Is er een manier om dit te beperken, ofwel het wijzigen van mijn code, of zelfs de bibliotheek zelf, of is mijn omgeving niet geschikt voor deze operatie?

De vraag is gesteld op 02/12/2019 om 23:54
bron van user
In andere talen...                            


1 antwoorden

Pyautogui en pyscreeze crash met windll.user32.ReleaseDC is mislukt

stemmen
0

Ik ben op zoek naar bepaalde pixel waarden te vergelijken in mijn pyautogui script, maar het crasht met de volgende foutmelding na ofwel meerdere succesvolle runs, of soms gewoon rechtdoor op de eerste gesprek:

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

Mijn code (dit wordt meerdere malen genoemd, soms crasht op de eerste run, soms loopt het mooi voor ongeveer 100 oproepen alvorens het als mislukt, ook, mijn scherm is 4K, zodat de resoluties groot worden):

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

Ik heb geen idee hoe dit probleem te verminderen. Het lijkt erop dat pyautogui gebruik pyscreeze om pixelwaarden op het scherm, en de meest waarschijnlijke kandidaat te lezen voor de plaats waar de fout zich voordoet is de pyscreeze pixel-functie:

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

Ik installeerde deze bibliotheken gisteren, en ik ben bijna python 3.8 op Windows 10, en pyscreeze is versie 0.1.25 dus in theorie alles moet worden to-date, maar een of andere manier iets gaan crashen. Is er een manier om dit te beperken, ofwel het wijzigen van mijn code, of zelfs de bibliotheek zelf, of is mijn omgeving niet geschikt voor deze operatie?

antwoordde op 02/12/2019 om 23:54
bron van user

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