Я пытаюсь написать скрипт на python, который ищет на экране определенный цвет в RGB, получает координаты пикселей, а затем отправляет их в функцию щелчка, чтобы щелкнуть по нему. Вот мой код до сих пор:

from PIL import ImageGrab
import win32api, win32con

def click(x,y):
    win32api.SetCursorPos((x,y))
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0)

color = (10,196,182)
session = False
match = False

while(True):
    screen = ImageGrab.grab()
    found_pixels = []
    for i, pixel in enumerate(screen.getdata()):
        if pixel == color:
            match = True
            found_pixels.append(i)
            break
    else:
        match = False

    width, height = screen.size
    found_pixels_coords = [divmod(index, width) for index in found_pixels]

    if session == False and match == True:
        click(found_pixels_coords)
        print("Match_Found")
        session = True
    if session == True and match == False:
        session = False

Как я могу преобразовать вывод founds_pixels_coords, чтобы использовать его внутри функции click(x,y)? Я также получаю обратные выходные значения, (y,x) вместо (x,y), что я не понимаю, почему.

Вот мой вывод на консоль, на случай, если я совершенно не прав:

Traceback (most recent call last):
  File "test2.py", line 28, in <module>
    click(found_pixels_coords)
TypeError: click() missing 1 required positional argument: 'y'

< Сильный > EDIT : click(*found_pixels_coords[0]), как предлагает @martineau, похоже, решает проблему с отсутствующим аргументом. Я также обошел обратные значения, определив click(y,x). Любое правильное решение этого вопроса, однако, будет с благодарностью.

2
Wutwut Boody 29 Июн 2019 в 01:42

3 ответа

Лучший ответ

Поскольку found_pixels_coords является списком (хотя он никогда не будет содержать более одного набора координат), вот как использовать один набор в нем (если есть совпадения):


    .
    .
    .
    if session == False and match == True:
        click(*found_pixels_coords[0]) # <== Do it like this.
        print("Match_Found")
        session = True
    if session == True and match == False:
        session = False
    .
    .
    .

1
martineau 28 Июн 2019 в 23:18

Поскольку вы говорите, что порядок координат инвертирован, мы можем использовать две вспомогательные переменные, чтобы распаковать значения и затем передать их в требуемом порядке:

y, x = found_pixels_coords
click(x, y)

Если found_pixels_coords является списком с несколькими координатами, то вы можете выбрать первый с помощью:

y, x = found_pixels_coords[0]
click(x, y)
0
jacalvo 28 Июн 2019 в 23:45

Просто вызовите click() следующим образом (добавьте * перед именем списка, чтобы распаковать значения).

click(*found_pixels_coords)  # Make sure list contains 2 values

Если вы не уверены в количестве элементов в списке found_pixels_coords, просто измените сигнатуру функции click() с

def click(x, y):

Кому

def click(x, y, *args):

В этом случае, если в списке будет более 2 значений, нет проблем, 3 в последующем будут в кортеже args.

1
hygull 28 Июн 2019 в 23:23