如何运行无限循环直到它在Python中找到值?

时间:2018-03-13 05:37:18

标签: python loops infinite pyautogui

到目前为止,我对Python相对较新并且很有趣。

我要做的是使用Python及其库Pyautogui找到按钮的位置。

这是我的代码。

import webbrowser, pyautogui, time, datetime

class workDoneClicker:

    def buttonTrack(self):
        global x, y
        x = ()
        y = ()
        while x == ():
            coordinate = pyautogui.locateOnScreen('image.png')
            x, y = (coordinate[0], coordinate[1])
            return x, y

    def clicker(self):         

        if pyautogui.alert(text="hi", title="hi") == 'OK':
            webbrowser.open('http://example.com')
            time.sleep(3)
            self.buttonTrack()
            self.clickButton()
            print("executed")

        else:
           print("not executed")

我想要做的是执行buttonTrack函数,直到找到值,然后返回x,y。
并在clicker功能中运行下一个代码 使用buttonTrack函数获取值需要几秒钟,因为它必须加载网页 但是当我运行代码点击器时,它似乎不会进行无限循环,直到它找到值但运行下一个代码,因为我得到'NoneType'对象不可订阅

请问如何按照我的预期跑步?和解释?

3 个答案:

答案 0 :(得分:1)

当找不到按钮时,pyautogui.locateOnScreen()函数返回None,并且您正在尝试执行由于None无法下标而抛出错误的坐标[0]。您可以添加一个检查,如果坐标值不是None,则只填充x和y值。

class workDoneClicker:
  def buttonTrack(self):
    global x, y
    x = ()
    y = ()
    while x == ():
        coordinate = pyautogui.locateOnScreen('image.png')
        if(coordinate is not None):
            x, y = (coordinate[0], coordinate[1])
            return x, y
def clicker(self):
    if pyautogui.alert(text="hi", title="hi") == 'OK':
        webbrowser.open('http://example.com')
        time.sleep(3)
        self.buttonTrack()
        self.clickButton()
        print("executed")
    else:
        print("not executed")

答案 1 :(得分:0)

  

如果在屏幕上找不到图像,locateOnScreen()将返回None。

http://pyautogui.readthedocs.io/en/latest/screenshot.html

因此,如果找不到namespace Project04 { class Program { static bool _Terminate = false; static Timer aTimer = new Timer(); static void Main(string[] args) { aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); aTimer.Interval = 5000; string choice; //menu do { Console.WriteLine("Select an option:"); Console.WriteLine("A) Start Ping"); Console.WriteLine("B) Stop Ping"); Console.WriteLine("C) Exit"); choice = Console.ReadLine().ToUpper(); switch (choice) { case "A": _Terminate = false; RunPing(); break; case "B": _Terminate = true; break; default: break; } Console.Clear(); } while (choice != "C"); } public static void RunPing() { aTimer.Enabled = true; } private static void OnTimedEvent(object source, ElapsedEventArgs e) { string[] fields = null; //csv reader using (TextFieldParser parser = new TextFieldParser("Project04_URLs.csv")) { parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters(","); fields = parser.ReadFields(); } foreach (string URL in fields) { if (_Terminate) { aTimer.Enabled = false; return; } try { //ping Ping myPing = new Ping(); PingReply reply = myPing.Send(URL, 5000); if (reply != null) { //write ping to other csv using (StreamWriter writer = new StreamWriter(string.Format("Ping_Data-{0}-{1}.csv", URL, DateTime.Now.ToString("ddMMyyyy-HHmmss")))) { writer.WriteLine("Status : " + reply.Status + " \n Time : " + reply.RoundtripTime.ToString() + " \n Address : " + reply.Address); // Redundant writer.Flush(); writer.Close(); } } } catch { Console.WriteLine("ERROR: You have Some TIMEOUT issue"); } } } } } ,坐标将变为image.png,这会在下一行引发错误,因为您无法在None对象上执行[0]

添加无条件,它应该正常工作。

None

答案 2 :(得分:0)

我以前从未使用过这个API,但是通过问题中的文档和详细信息,我将尽力回答。 要运行无限循环,您只需使用while True: 在你的问题的背景下:

x = ()
y = ()
while True:
    coordinate = pyautogui.locateOnScreen('image.png')
        if coordinate:
            x, y = (coordinate[0], coordinate[1])
            return x, y