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

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

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
Shane 11 Авг 2010 в 16:06

2 ответа

Лучший ответ

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

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

Ты видишь проблему? В худшем случае ваша программа может никогда больше не вызвать wait-for-an-event, потому что ваш цикл запущен.

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

Затем в своей функции вы вызываете wx.CallAfter или < a href = "http://www.wxpython.org/docs/api/wx.CallLater-class.html" rel = "nofollow noreferrer"> wx.CallLater еще раз, чтобы вызвать его снова на следующая итерация цикла событий.

4
Bryan Oakley 11 Авг 2010 в 13:23

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

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

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

0
Community 23 Май 2017 в 12:13