Pyautogui e crash pyscreeze con windll.user32.ReleaseDC fallito

voti
0

Sto cercando di confrontare determinati valori dei pixel nel mio script pyautogui, ma si blocca con il seguente messaggio di errore dopo che sia più esecuzioni di successo, oa volte solo dritto alla prima chiamata:

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

Il mio codice (questo è chiamato più volte, a volte si blocca sulla prima esecuzione, a volte si corre bene per circa 100 chiamate prima di fallire, anche, il mio schermo è 4K, in modo che le risoluzioni diventano grandi):

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

Non ho idea di come attenuare questo problema. Sembrerebbe che usi pyautogui pyscreeze per leggere i valori dei pixel sullo schermo, e la maggior parte candidato probabile per il luogo in cui si verifica l'errore è la funzione 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]))

Ho installato queste librerie proprio ieri, e sto correndo python 3.8 su Windows 10, e pyscreeze è la versione 0.1.25 quindi in teoria tutto dovrebbe essere sempre aggiornato, ma in qualche modo qualcosa finisce per schiantarsi. C'è un modo per attenuare questo, sia modificando il mio codice, o anche la libreria stessa, o è il mio ambiente non è adatto per questa operazione?

È pubblicato 02/12/2019 alle 23:54
fonte dall'utente
In altre lingue...                            


1 risposte

Pyautogui e crash pyscreeze con windll.user32.ReleaseDC fallito

voti
0

Sto cercando di confrontare determinati valori dei pixel nel mio script pyautogui, ma si blocca con il seguente messaggio di errore dopo che sia più esecuzioni di successo, oa volte solo dritto alla prima chiamata:

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

Il mio codice (questo è chiamato più volte, a volte si blocca sulla prima esecuzione, a volte si corre bene per circa 100 chiamate prima di fallire, anche, il mio schermo è 4K, in modo che le risoluzioni diventano grandi):

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

Non ho idea di come attenuare questo problema. Sembrerebbe che usi pyautogui pyscreeze per leggere i valori dei pixel sullo schermo, e la maggior parte candidato probabile per il luogo in cui si verifica l'errore è la funzione 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]))

Ho installato queste librerie proprio ieri, e sto correndo python 3.8 su Windows 10, e pyscreeze è la versione 0.1.25 quindi in teoria tutto dovrebbe essere sempre aggiornato, ma in qualche modo qualcosa finisce per schiantarsi. C'è un modo per attenuare questo, sia modificando il mio codice, o anche la libreria stessa, o è il mio ambiente non è adatto per questa operazione?

Risposto il 02/12/2019 a 23:54
fonte dall'utente

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