如何正确转换列表的输出值以将其用作函数内的args?

时间:2019-06-28 22:42:35

标签: python python-3.x windows python-imaging-library

我试图用python编写脚本,该脚本在屏幕上搜索RGB中的特定颜色,获取像素坐标,然后将其发送到click函数以对其进行单击。到目前为止,这是我的代码:

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'

编辑:  @martineau建议的click(*found_pixels_coords[0])似乎可以解决缺少的参数错误。我还通过定义click(y,x)来绕过反向值。任何对此的适当解决方案,将不胜感激。

3 个答案:

答案 0 :(得分:1)

由于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 :(得分:1)

只需这样调用click()(在列表名称前添加*即可解压缩值)。

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

如果不确定found_pixels_coords列表中的项目数,则只需更改click()函数的签名即可

def click(x, y):

def click(x, y, *args):

在这种情况下,如果列表中有两个以上的值,则没问题,args元组中将包含3个以上的值。

答案 2 :(得分:0)

正如您所说的,坐标的顺序是倒置的,我们可以使用两个辅助变量来解压值,然后按所需的顺序传递它们:

y, x = found_pixels_coords
click(x, y)

如果found_pixels_coords是具有多个坐标的列表,则可以使用以下选项选择第一个:

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