当while循环放在wxPython事件中时

时间:2010-08-11 12:06:32

标签: python event-handling wxpython

我正在尝试编写一个从网页中抓取特定内容的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)

问题是什么?

2 个答案:

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

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

答案 1 :(得分:0)

您可以拨打wxApp::Yieldtime.sleep(10)十次而不是time.sleep(1)

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

Bryan Oakley's solution可能是更好的方式。