Как правильно преобразовать выходные значения списка, чтобы использовать их в качестве аргументов внутри функции? - PullRequest
2 голосов
/ 29 июня 2019

Я пытаюсь написать скрипт на 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). Однако, любое правильное решение этого вопроса будет с благодарностью.

Ответы [ 3 ]

1 голос
/ 29 июня 2019

Поскольку 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 голос
/ 29 июня 2019

Просто наберите 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 кортеже.

0 голосов
/ 29 июня 2019

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

y, x = found_pixels_coords
click(x, y)

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

y, x = found_pixels_coords[0]
click(x, y)
...