在wxPython事件中放置while循环时

2 投票
2 回答
1424 浏览
提问于 2025-04-16 02:37

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

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

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 个回答

-1

与其使用 time.sleep(10) 让程序停十秒,不如调用 wxApp::Yield,然后用 time.sleep(1) 这个方法重复十次。

要注意可能会出现重入问题(比如再次按下开始按钮)。在事件处理过程中,开始按钮可能会变得不可点击。

不过,Bryan Oakley 的解决方案 可能是更好的选择。

4

当你在写一个基于事件的程序时,程序的整体流程是这样的:

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,这样它就会在事件循环的下一个迭代中再次被调用。

撰写回答