while循环放在wxPython事件中时

2024-10-03 13:23:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写一个GUI程序从一个网页抓取特定的内容。我的想法是,当我点击开始按钮时,程序应该开始从该页面提取信息。我想添加一些代码来检查是否连接到互联网。如果没有,请继续尝试直到连接。在

所以我只是在事件中添加了以下代码,但是发现它不起作用。而且整个程序必须以强制方式关闭。我的代码是:

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)

有什么问题吗?在


Tags: 代码import程序信息网页内容time事件
2条回答

当您有一个基于事件的程序时,程序的总体流程如下:

while the-program-is-running:
    wait-for-an-event
    service-the-event
exit

现在,让我们看看当服务事件调用具有(潜在)无限循环的内容时会发生什么:

^{pr2}$

你看到问题了吗?在更糟糕的情况下,由于循环正在运行,您的程序可能再也不会调用wait for a event。在

请记住:事件循环已经是一个无限循环,您不需要在其中添加另一个无限循环。相反,利用现有的循环。可以使用wx.CallAfterwx.CallLater调用一个方法,该方法将导致在事件循环的下一次迭代中调用函数。在

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

您可以调用wxApp::Yield和{}十次,而不是time.sleep(10)。在

小心重入问题(例如再次按下启动按钮)。“开始”按钮在事件处理程序中时可能会变暗。在

但是Bryan Oakley's solution可能是更好的方法。在

相关问题 更多 >