Pyautogui und pyscreeze Absturz mit windll.user32.ReleaseDC gescheitert

stimmen
0

Ich versuche, bestimmte Pixelwerte in meinem pyautogui Skript zu vergleichen, aber es stürzt mit folgenden Fehlermeldung, nachdem entweder mehrere erfolgreichen Läufen, oder manchmal nur gerade auf dem ersten Aufruf:

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

Mein Code (dies wird mehrmals aufgerufen, manchmal stürzt es auf den ersten Lauf, manchmal läuft es gut für rund 100 Anrufe, bevor ein Fehler, auch, mein Bildschirm 4K ist, so dass die Auflösung groß werden):

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

Ich habe keine Ahnung, wie dieses Problem zu mildern. Es wäre, dass pyautogui Anwendungen pyscreeze scheinen Pixelwerte auf dem Bildschirm zu lesen, und wahrscheinlichste Kandidat für den Ort, an dem Fehler auftritt, ist die pyscreeze Pixelfunktion:

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

Ich installierte diese Bibliotheken nur gestern, und ich bin mit Python 3.8 auf Windows 10 und pyscreeze ist Version 0.1.25 so in der Theorie alles auf dem neuesten Stand sein sollte, aber irgendwie etwas Enden abstürzt. Gibt es eine Möglichkeit, dies zu mildern, entweder meinen Code zu ändern oder sogar die Bibliothek selbst, oder ist meine Umgebung für diesen Vorgang nicht geeignet?

Veröffentlicht am 02/12/2019 um 23:54
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

Pyautogui und pyscreeze Absturz mit windll.user32.ReleaseDC gescheitert

stimmen
0

Ich versuche, bestimmte Pixelwerte in meinem pyautogui Skript zu vergleichen, aber es stürzt mit folgenden Fehlermeldung, nachdem entweder mehrere erfolgreichen Läufen, oder manchmal nur gerade auf dem ersten Aufruf:

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

Mein Code (dies wird mehrmals aufgerufen, manchmal stürzt es auf den ersten Lauf, manchmal läuft es gut für rund 100 Anrufe, bevor ein Fehler, auch, mein Bildschirm 4K ist, so dass die Auflösung groß werden):

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

Ich habe keine Ahnung, wie dieses Problem zu mildern. Es wäre, dass pyautogui Anwendungen pyscreeze scheinen Pixelwerte auf dem Bildschirm zu lesen, und wahrscheinlichste Kandidat für den Ort, an dem Fehler auftritt, ist die pyscreeze Pixelfunktion:

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

Ich installierte diese Bibliotheken nur gestern, und ich bin mit Python 3.8 auf Windows 10 und pyscreeze ist Version 0.1.25 so in der Theorie alles auf dem neuesten Stand sein sollte, aber irgendwie etwas Enden abstürzt. Gibt es eine Möglichkeit, dies zu mildern, entweder meinen Code zu ändern oder sogar die Bibliothek selbst, oder ist meine Umgebung für diesen Vorgang nicht geeignet?

Beantwortet am 02/12/2019 um 23:54
quelle vom benutzer

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