【问题标题】:When while loop placed in wxPython events当 while 循环放置在 wxPython 事件中时
【发布时间】:2010-08-11 12:06:31
【问题描述】:

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

可能是什么问题?

【问题讨论】:

  • 您注意到代码中的错字了吗?互联网rNotOn
  • 抱歉打错了...刚刚更正了
  • “一切都很好!”打印?一次?还是多次?
  • @unutbu:如果连接到互联网,一切正常。 “一切安好!”只打印一次。问题是当你没有连接到互联网时,我只想让程序每 10 秒左右检查一次连接,如果连接就完成这项工作。但是代码没有像我预期的那样工作,程序冻结,你必须强制 GUI 程序退出。不过,控制台中每 10 秒打印一次“错误”。

标签: python event-handling wxpython


【解决方案1】:

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

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 以使其在事件循环的下一次迭代中再次被调用。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-17
      相关资源
      最近更新 更多