Pyautogui és pyscreeze összeomlás windll.user32.ReleaseDC sikertelen

szavazat
0

Próbálom összehasonlítani egyes pixel értékeket én pyautogui script, de összeomlik következő hibaüzenet után sem több sikeres fut, vagy néha csak egyenesen az első hívást:

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

Saját kód (ezt nevezik többször, néha lefagy az első futás, néha fut szépen mintegy 100 hívás előtt hiányában is, a képernyő 4K, így az állásfoglalások kap nagy):

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

Fogalmam sincs, hogyan kell a felzárkóztatásra. Úgy tűnik, hogy pyautogui felhasználási pyscreeze olvasni pixel értékeket a képernyőn, és a legvalószínűbb jelölt a hely, ahol a hiba jelentkezik a pyscreeze pixel funkció:

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

Telepítettem a könyvtárak csak tegnap, és rohanok python 3.8 a Windows 10 és pyscreeze verziója 0.1.25 így elméletileg mindent meg kell naprakész, de valahogy valami véget ér összeomlik. Van egy módja annak, hogy enyhítse ezt, hogy megváltoztatjuk a kód, vagy akár maga a könyvtár, vagy a környezetem nem alkalmas ez a művelet?

A kérdést 02/12/2019 23:54
a forrás felhasználó
Más nyelveken...                            


1 válasz

Pyautogui és pyscreeze összeomlás windll.user32.ReleaseDC sikertelen

szavazat
0

Próbálom összehasonlítani egyes pixel értékeket én pyautogui script, de összeomlik következő hibaüzenet után sem több sikeres fut, vagy néha csak egyenesen az első hívást:

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

Saját kód (ezt nevezik többször, néha lefagy az első futás, néha fut szépen mintegy 100 hívás előtt hiányában is, a képernyő 4K, így az állásfoglalások kap nagy):

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

Fogalmam sincs, hogyan kell a felzárkóztatásra. Úgy tűnik, hogy pyautogui felhasználási pyscreeze olvasni pixel értékeket a képernyőn, és a legvalószínűbb jelölt a hely, ahol a hiba jelentkezik a pyscreeze pixel funkció:

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

Telepítettem a könyvtárak csak tegnap, és rohanok python 3.8 a Windows 10 és pyscreeze verziója 0.1.25 így elméletileg mindent meg kell naprakész, de valahogy valami véget ér összeomlik. Van egy módja annak, hogy enyhítse ezt, hogy megváltoztatjuk a kód, vagy akár maga a könyvtár, vagy a környezetem nem alkalmas ez a művelet?

Válaszolt 02/12/2019 23:54
a forrás felhasználó

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