python-3.x PyAutoGui和PyScreeze

pb3s4cty  于 2023-10-21  发布在  Python
关注(0)|答案(1)|浏览(188)

我写了一个简单的Osu!机器人,但它不工作。我没有得到任何错误,直到我打开(全屏)osu。我已经尝试从cmd与管理员运行它,但它只是不工作。我得到这个错误:

Traceback (most recent call last):
  File "C:/Users/Kris/PycharmProjects/OsuBot/venv/drums.py", line 7, in <module>
    if pyautogui.pixel(609, 440)[0] == 235:
  File "C:\Users\Kris\AppData\Local\Programs\Python\Python38\lib\pyscreeze\__init__.py", line 584, in pixel
    return (r, g, b)
  File "C:\Users\Kris\AppData\Local\Programs\Python\Python38\lib\contextlib.py", line 120, in __exit__
    next(self.gen)
  File "C:\Users\Kris\AppData\Local\Programs\Python\Python38\lib\pyscreeze\__init__.py", line 113, in __win32_openDC
    raise WindowsError("windll.user32.ReleaseDC failed : return 0")
OSError: windll.user32.ReleaseDC failed : return 0

Process finished with exit code 1

我在运行IDLE,cmd和PyCharm时得到错误。
下面是我的代码:

import pyautogui
import keyboard
import time

while 1:
    if pyautogui.pixel(609, 440)[0] == 235:
        keyboard.press('x')
        time.sleep(0.1)
        keyboard.release('x')
    if pyautogui.pixel(609, 440)[0] == 67:
        keyboard.press('z')
        time.sleep(0.1)
        keyboard.release('z')
    time.sleep(0.01)

# X:  609 Y:  440 RGB: ( 32,  99, 222)
# RED = X: 1534 Y:  485 RGB: (235,  69,  44)
# BLUE = X: 1138 Y:  459 RGB: ( 67, 142, 172)

先谢了。

z9smfwbn

z9smfwbn1#

看起来pyautogui在像素识别方面有一些问题,因为我也尝试了pyautogui.pixel(),我似乎得到了相同的OSError: windll.user32.ReleaseDC failed : return 0,但是由于某种原因,它工作了一半的时间,我得到了正常运行的代码。虽然不知道为什么,我没有做任何事情,除了重新运行程序连续几次,直到它的工作。
您可以使用pip install pillow来尝试pillow库,它具有getpixel()函数。你必须先截图,但幸运的是pyautogui已经覆盖了:

from PIL import Image
import pyautogui as py

py.screenshot('file.png')

img = Image.open('file.png')
print(img.getpixel((180, 90)))

我看到你也在使用keyboard库,但老实说,你可以只使用pyautogui,然后你就不需要导入额外的库。

最终代码

import time
from PIL import Image
import pyautogui as py

while 1:

    py.screenshot('file.png')
    img = Image.open('file.png')
    
    if img.getpixel((609, 440))[0] == 235:
        py.press('x')
    if img.getpixel((609, 440))[0] == 67:
        py.press('z')
    time.sleep(1)

相关问题