我正在尝试编写一个从网页中抓取特定内容的GUI程序。我的想法是当我点击开始按钮时,程序应该开始从该页面提取信息。我想添加一些代码来检查是否连接到Internet。如果没有,继续尝试直到连接。
所以我刚刚在事件中添加了以下代码,但发现它不起作用。整个计划也必须以强制方式关闭。这是我的代码:
import urllib2
import time
InternetNotOn = True
while InternetNotOn:
try:
urllib2.urlopen("http://google.com")
InternetNotOn = False
print "Everyting is fine!"
except urllib2.URLError, e:
print "Error!"
time.sleep(10)
问题是什么?
答案 0 :(得分:4)
如果您有基于事件的程序,程序的整体流程如下:
while the-program-is-running:
wait-for-an-event
service-the-event
exit
现在,让我们看看当service-the-event调用具有(可能)无限循环的东西时会发生什么:
while the-program-is-running:
wait-for-an-event
while the-internet-is-on:
do-something
exit
你看到了问题吗?在更糟糕的情况下,您的程序可能永远不会再次调用wait-for-a-event,因为您的循环正在运行。
请记住:事件循环已经是一个无限循环,您不需要在其中添加另一个无限循环。相反,利用现有的循环。您可以使用wx.CallAfter或wx.CallLater来调用一个方法,该方法将导致在下一次迭代事件循环时调用您的函数。
然后,在您的函数中,再次调用wx.CallAfter或wx.CallLater,以便在事件循环的下一次迭代中再次调用它。
答案 1 :(得分:0)
您可以拨打wxApp::Yield和time.sleep(10)
十次而不是time.sleep(1)
。
注意重入问题(例如,再次按下开始按钮)。在事件处理程序中,开始按钮可能会变暗。
但Bryan Oakley's solution可能是更好的方式。