Pyautogui और windll.user32.ReleaseDC साथ pyscreeze दुर्घटना में विफल रहा है

वोट
0

मैं अपने pyautogui लिपि में कुछ पिक्सेल मूल्यों की तुलना करने की कोशिश कर रहा हूँ, लेकिन यह सिर्फ सीधे पहली कॉल पर कभी कभी तो कई सफल रन के बाद त्रुटि संदेश के बाद, या के साथ दुर्घटनाओं:

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

मेरे कोड (इस कई बार कहा जाता है, कभी कभी यह पहली बार चलाने पर दुर्घटनाओं, कभी कभी यह करीब 100 कॉल के लिए अच्छी तरह से चलाता है से पहले नाकाम रहने, भी, मेरी स्क्रीन 4K है, इसलिए प्रस्तावों बड़ी हो):

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

मैं कैसे इस समस्या को कम करने के लिए पता नहीं है। ऐसा नहीं है कि pyautogui का उपयोग करता है pyscreeze प्रतीत होता है वह जगह है जहां त्रुटि तब होती है pyscreeze पिक्सेल समारोह है के लिए स्क्रीन पर पिक्सेल मूल्यों, और सबसे संभावित उम्मीदवार को पढ़ने के लिए:

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

मैं इन पुस्तकालयों बस कल दुर्घटनाग्रस्त अप कुछ समाप्त होता है स्थापित है, और मैं खिड़कियों 10 पर अजगर 3.8 चल रहा हूँ, और pyscreeze सिद्धांत में सब कुछ इतना संस्करण 0.1.25 है तारीख तक होना चाहिए, लेकिन किसी भी तरह। इस कम करने के लिए, या तो मेरी कोड को संशोधित करने, या यहाँ तक कि पुस्तकालय में ही एक रास्ता है, या मेरे वातावरण इस कार्रवाई के लिए उपयुक्त नहीं है?

02/12/2019 को 23:54
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


1 जवाब

Pyautogui और windll.user32.ReleaseDC साथ pyscreeze दुर्घटना में विफल रहा है

वोट
0

मैं अपने pyautogui लिपि में कुछ पिक्सेल मूल्यों की तुलना करने की कोशिश कर रहा हूँ, लेकिन यह सिर्फ सीधे पहली कॉल पर कभी कभी तो कई सफल रन के बाद त्रुटि संदेश के बाद, या के साथ दुर्घटनाओं:

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

मेरे कोड (इस कई बार कहा जाता है, कभी कभी यह पहली बार चलाने पर दुर्घटनाओं, कभी कभी यह करीब 100 कॉल के लिए अच्छी तरह से चलाता है से पहले नाकाम रहने, भी, मेरी स्क्रीन 4K है, इसलिए प्रस्तावों बड़ी हो):

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

मैं कैसे इस समस्या को कम करने के लिए पता नहीं है। ऐसा नहीं है कि pyautogui का उपयोग करता है pyscreeze प्रतीत होता है वह जगह है जहां त्रुटि तब होती है pyscreeze पिक्सेल समारोह है के लिए स्क्रीन पर पिक्सेल मूल्यों, और सबसे संभावित उम्मीदवार को पढ़ने के लिए:

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

मैं इन पुस्तकालयों बस कल दुर्घटनाग्रस्त अप कुछ समाप्त होता है स्थापित है, और मैं खिड़कियों 10 पर अजगर 3.8 चल रहा हूँ, और pyscreeze सिद्धांत में सब कुछ इतना संस्करण 0.1.25 है तारीख तक होना चाहिए, लेकिन किसी भी तरह। इस कम करने के लिए, या तो मेरी कोड को संशोधित करने, या यहाँ तक कि पुस्तकालय में ही एक रास्ता है, या मेरे वातावरण इस कार्रवाई के लिए उपयुक्त नहीं है?

02/12/2019 को 23:54
का स्रोत उपयोगकर्ता

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