2012-07-26 5 views
1

MySQL 데이터베이스에서 변경 사항을 확인하고 GTK 표시를 업데이트하는 프로그램을 만들고 있습니다. 검사를 계속하는 부분은 무한 루프에 있습니다.gtk 창이 닫힌 후 무한 루프가 종료됩니다.

내가 원하는 것은 일단 GTK 창이 닫히면 무한 루프를 벗어날 수 있다는 것입니다.

하지만 어떤 조건을 사용해야할지 모르겠다. 나는

if !window: 

if window == None: 

을 시도했지만 두 경우 모두, 그것은 작동하지 않습니다.

내 코드의 구조는 다음과 같다 :

while True: 

    # my code 

    while gtk.events_pending(): 
     gtk.main_iteration() 

    # something to exit here 

window.connect("destroy", gtk.main_quit()) 

배치하는 문제가 발생할 수 있습니다 "window.connect"경우 윈도우가 잘 닫 것 때문에 나는 모른다. 또한, 내가 루프 내에 배치하거나 루프 전에 배치하면 런타임 오류가 발생합니다 : mainloop 외부에서 호출됩니다.

다시 반복하려면 조건의 창 닫기를 사용하여 무한 루프를 종료하려면 어떻게합니까? 사용자가 Ctrl + C를 사용하지 못하도록하고 싶습니다.

미리 감사드립니다.

답변

0

pygtk 응용 프로그램의 기본 구조에 닫는 세트 이벤트를 파괴 연결 한 후

closing = False 

while not closing: 
    // do the MySQL stuff 

을 그리고 보통이 같은 것입니다 :

win = gtk.MyWindow() 
win.connect("destroy", gtk.main_quit) # Note no paretheses after main_quit. 
gobject.timeout_add(1000, win.check_DB) 
win.show_all() 
gtk.main() 

gobject.timeout_add 명령은 1000 밀리 초마다 win.check_DB 메서드를 호출합니다.


win.connect("destroy", gtk.main_quit)main_quit 뒤에 괄호를 넣어하지 않는 것이 중요합니다. 함수 개체 gtk.main_quitwin.connect 메서드에 전달하고 gtk.main_quit() 호출의 반환 값이 아닌 괄호를 추가하면 발생합니다.

gtk.main_quit()은 앱을 종료하므로 여기에서 괄호를 사용하면 프로그램이 너무 일찍 중단됩니다.

+0

나는 이것을 시험해 보았다. check_DB라는 함수를 만들었습니다. 첫째로 나는 이것을 gobject.timeout_add (1000, check_DB)와 같이 호출하려고 시도했지만 작동하지 않는 것 같습니다. MySQL 데이터베이스에 대한 연결을 반복해서 만들고 싶지 않으므로이 비트를 기능 내부에서 수행하고 싶지는 않습니다. 그러나 connection 변수를 check_Db에 전달할 수 없습니다. 도와 주시겠습니까? – Antimony

+0

간단하게하기 위해 연결 개체를 전역 변수로 만듭니다. http://stackoverflow.com/questions/423379/using-global-variables-in-a-function-other-than-the-one-that-created-them – anttix

+0

@Antimony : win.connection을 설정하면 = MySQLdb.connect (...)'를 실행하면'win.check_DB'가 호출 될 때 사용할 수 있습니다. 또는 @anttix가 암시 하듯이 연결을 전역 변수로 만들 수 있습니다. – unutbu

1

이것은 고전적인 배경 스레드 문제입니다. 당신은이 같은 루프가 필요합니다 : 윈도우에 신호 핸들러가 진정한

+0

고마워요,하지만 어떻게해야합니까? 이미 gtk.main_quit 이벤트에 window destroy 이벤트를 연결했습니다. – Antimony

+0

자신 만의 핸들러를 만들고 거기에서 gtk.main_quit를 호출하십시오. 그러나 unutbu가 제안한 솔루션은 구조적으로 훨씬 뛰어나다 고 생각합니다.이 경우 GTK가 프로그램의 메인 루프를 처리 할 것입니다 – anttix

+0

unutbu의 솔루션을 구현 한 방식으로 나에게 도움이되지 못했습니다. 내가 누락되었을 수있는 것을 제안 해 주시겠습니까? (나는 그의 해결책 아래에 코멘트를 남겼다) – Antimony

관련 문제