繁体   English   中英

当while循环置于wxPython事件中时

[英]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.CallAfterwx.CallLater来调用一个方法,该方法将导致在事件循环的下一次迭代中调用您的函数。

然后,在函数中再次调用wx.CallAfterwx.CallLater ,以使其在事件循环的下一次迭代中再次被调用。

代替time.sleep(10)您可以调用wxApp :: Yieldtime.sleep(1)十次。

提防重入问题(例如,再次按下开始按钮。)。 在事件处理程序中,开始按钮可能会变暗。

但是布莱恩·奥克利(Bryan Oakley)的解决方案可能是更好的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM