Когда цикл while помещается в события wxPython - PullRequest
2 голосов
/ 11 августа 2010

Я пытаюсь написать программу с графическим интерфейсом, получающую определенное содержимое с веб-страницы.Идея в том, что когда я нажимаю кнопку запуска, программа должна начать извлекать информацию с этой страницы.И я хочу добавить код, чтобы проверить, подключен ли он к Интернету.Если нет, продолжайте попытки, пока не подключитесь.

Поэтому я просто добавил следующий код в событие, но обнаружил, что он не работает.Также вся программа должна быть принудительно закрыта.Вот мой код:

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 ]

4 голосов
/ 11 августа 2010

Если у вас есть программа, основанная на событиях, общий поток программы такой:

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.CallAfter или wx.CallLater для вызова метода, который вызовет вызов вашей функции на следующей итерации цикла событий.

Затем внутри своей функции вы снова вызываете wx.CallAfter или wx.CallLater , чтобы снова вызвать его на следующей итерации цикла событий.

0 голосов
/ 11 августа 2010

Вместо time.sleep(10) вы можете вызывать wxApp :: Yield и time.sleep(1) десять раз.

Остерегайтесь проблем с повторным входом (например, снова нажмите кнопку запуска).Кнопка запуска может быть недоступна в обработчике событий.

Но Решение Брайана Оукли , вероятно, лучший способ.

...