嵌套循环更有效的中断方法?

时间:2019-02-22 01:47:32

标签: python python-3.x break

好,所以我有这个脚本,它只单击具有一定灰色阴影的像素,除一件事外,它在大多数情况下都可以正常工作,它循环的时间太长,每次需要大约一秒钟才能完成我应该更改休息时间以更好地工作,并阻止它在ive找到一个有效像素后四处循环吗?

xx = 0
while xx <= 600:
    with mss.mss() as sct:
        region = {'top': 0, 'left': 0, 'width': 1920, 'height': 1080}
        imgg = sct.grab(region)
        pxls = imgg.pixels

        for row, pxl in enumerate(pxls):
            for col, pxll in enumerate(pxl):
                if pxll == (102, 102, 102):
                    if col>=71 and col<=328 and row<=530 and row>=378:
                        foundpxl = pxll
                        print(str(col) +" , "+ str(row))
                        pyautogui.click(col,row)
                        break
        xx = xx + 1
        time.sleep(.05)

2 个答案:

答案 0 :(得分:0)

如果在内圈或外圈for-else中找不到有效像素(因此没有出现continue),则可以使用break构造来break如果找到一个:

for row, pxl in enumerate(pxls):
    for col, pxll in enumerate(pxl):
        if pxll == (102, 102, 102) and col >= 71 and col <= 328 and row <= 530 and row >= 378:
            foundpxl = pxll
            print(str(col) + " , " + str(row))
            pyautogui.click(col, row)
            break
    else:
        continue
    break

答案 1 :(得分:0)

免责声明:我对mss不熟悉。 您可以改进的几件事:

  1. 无需枚举您不感兴趣的值。您可以这样做:
for row, pxl in enumerate(pxls, start=378):
    if row > 530:
       break
    for col, pxll in enumerate(pxl, start=71):
        if col > 328:
           break
  1. 您不能只截取所需区域的屏幕截图吗?这样的事情应该起作用吗?
region = {'top': 378, 'left': 71, 'width': 328-71, 'height': 530-378}
  1. 您正在使用双python循环操纵2D数组。您可以使用一些设计为对阵列执行操作的模块,并且速度可以快几个数量级。诸如Pandas或NumPy之类的东西应该几乎可以立即运行。