到目前为止,我对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'对象不可订阅。
请问如何按照我的预期跑步?和解释?
答案 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