Pyautogui i pyscreeze krach z windll.user32.ReleaseDC zawiodły

głosy
0

Próbuję porównać pewne wartości pikseli w moim pyautogui skrypcie, ale zawiesza się następujący komunikat o błędzie albo po wielu udanych tras, a czasem po prostu prosto na pierwszej rozmowy:

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 kod (nazywa się to wiele razy, czasami zawiesza się na pierwszym biegu, czasem działa ładnie na około 100 połączeń przed braku, także mój ekran jest 4K, więc uchwały dostać duże):

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

Nie mam pojęcia, jak złagodzić ten problem. Wydawać by się mogło, który wykorzystuje pyautogui pyscreeze czytać wartości pikseli na ekranie, a najbardziej prawdopodobnym kandydatem do miejsca, w którym występuje błąd jest funkcja pyscreeze pikseli:

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

Po zainstalowaniu tych bibliotek zaledwie wczoraj, a ja biegnę Pythona 3.8 na Windows 10, a pyscreeze jest wersja 0.1.25 więc teoretycznie wszystko powinno być na bieżąco, ale jakoś końce coś upaść. Czy istnieje sposób, aby złagodzić ten, albo modyfikując mój kod, a nawet biblioteki się, czy moje środowisko nie nadaje się do tej pracy?

Utwórz 02/12/2019 o 23:54
źródło użytkownik
W innych językach...                            


1 odpowiedzi

Pyautogui i pyscreeze krach z windll.user32.ReleaseDC zawiodły

głosy
0

Próbuję porównać pewne wartości pikseli w moim pyautogui skrypcie, ale zawiesza się następujący komunikat o błędzie albo po wielu udanych tras, a czasem po prostu prosto na pierwszej rozmowy:

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 kod (nazywa się to wiele razy, czasami zawiesza się na pierwszym biegu, czasem działa ładnie na około 100 połączeń przed braku, także mój ekran jest 4K, więc uchwały dostać duże):

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

Nie mam pojęcia, jak złagodzić ten problem. Wydawać by się mogło, który wykorzystuje pyautogui pyscreeze czytać wartości pikseli na ekranie, a najbardziej prawdopodobnym kandydatem do miejsca, w którym występuje błąd jest funkcja pyscreeze pikseli:

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

Po zainstalowaniu tych bibliotek zaledwie wczoraj, a ja biegnę Pythona 3.8 na Windows 10, a pyscreeze jest wersja 0.1.25 więc teoretycznie wszystko powinno być na bieżąco, ale jakoś końce coś upaść. Czy istnieje sposób, aby złagodzić ten, albo modyfikując mój kod, a nawet biblioteki się, czy moje środowisko nie nadaje się do tej pracy?

Odpowiedział 02/12/2019 o 23:54
źródło użytkownik

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