[英]When while loop placed in wxPython events
我正在尝试编写一个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)
可能是什么问题?
当您有一个基于事件的程序时,该程序的总体流程如下:
while the-program-is-running:
wait-for-an-event
service-the-event
exit
现在,让我们看看事件服务调用一个(可能)无限循环的事件时会发生什么:
while the-program-is-running:
wait-for-an-event
while the-internet-is-on:
do-something
exit
看到问题了吗? 在最坏的情况下,由于循环正在运行,您的程序可能永远不会再调用事件等待。
请记住:事件循环已经是一个无限循环,您不需要在其中添加另一个无限循环。 而是利用现有循环。 您可以使用wx.CallAfter或wx.CallLater来调用一个方法,该方法将导致在事件循环的下一次迭代中调用您的函数。
然后,在函数中再次调用wx.CallAfter或wx.CallLater ,以使其在事件循环的下一次迭代中再次被调用。
代替time.sleep(10)
您可以调用wxApp :: Yield和time.sleep(1)
十次。
提防重入问题(例如,再次按下开始按钮。)。 在事件处理程序中,开始按钮可能会变暗。
但是布莱恩·奥克利(Bryan Oakley)的解决方案可能是更好的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.