我试图用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)
来绕过反向值。任何对此的适当解决方案,将不胜感激。
答案 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)