2010-08-11 5 views
2

웹 페이지에서 특정 내용을 잡는 GUI 프로그램을 작성하려고합니다. 아이디어는 시작 버튼을 누르면 프로그램이 해당 페이지에서 정보를 추출해야합니다. 인터넷에 연결되어 있는지 확인하기 위해 코드를 추가하고 싶습니다. 그렇지 않은 경우 연결될 때까지 계속 시도하십시오.while 루프가 wxPython 이벤트에있을 때

그래서 이벤트에 다음 코드를 추가했지만 작동하지 않는 것으로 나타났습니다. 또한 전체 프로그램을 강제로 종료해야합니다. 내 코드는 다음과 같습니다.

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) 

무엇이 문제입니까?

+0

코드에 오타가 있는지 확인 했습니까? Interne * r * NotOn – relet

+0

오타로 인해 죄송합니다. 바로 수정했습니다. – Shane

+1

"Everyting is fine!" 인쇄 되나요? 일단? 또는 여러 번? – unutbu

답변

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 

문제가 발생합니까? 최악의 경우 루프가 실행 중이기 때문에 프로그램에서 절대로 wait-for-an-event를 호출하지 않을 수 있습니다.

이벤트 루프는 이미 무한 루프이므로, 무한 루프를 추가 할 필요가 없습니다. 대신 기존 루프를 활용하십시오. wx.CallAfter 또는 wx.CallLater을 사용하여 이벤트 루프의 다음 반복에서 함수를 호출하게하는 메소드를 호출 할 수 있습니다.

그런 다음 함수 내에서 이벤트 루프의 다음 반복에서 다시 호출되도록하려면 wx.CallAfter 또는 wx.CallLater을 다시 호출해야합니다.

+0

고마워요. – Shane

+0

참고 http://wiki.wxpython.org/LongRunningTasks –

0

time.sleep(10) 대신 wxApp::Yieldtime.sleep(1) 번을 10 번 부를 수 있습니다.

재진입 문제 (예 : 다시 시작 버튼 누르기)에주의하십시오. 시작 단추는 이벤트 처리기에서 흐리게 표시 될 수 있습니다.

그러나 Bryan Oakley's solution이 아마도 더 좋은 방법 일 것입니다.

관련 문제