2012-10-28 3 views
4

일부 애플리케이션을 프로그래밍하는 중입니다. 버튼을 클릭 할 때 while 루프를 만들고 싶습니다. 클릭을 멈추려면 다시 클릭하십시오.Python 및 PyGTK : 버튼 클릭 중 멈춤

self.btnThisOne = gtk.Button("This one") 
self.btnThisOne.connect("clicked", self.startLoop) 

startLoop의 코드는 DEF 다음과 같습니다 :

def startLoop(self): 
    while self.btnThisOne?(is_clicked)?: 
     #do something 

어떻게 그렇게 할 수있는이 버튼에 대한 코드?

답변

3

불행히도 응용 프로그램의 주 스레드에서 실행되는 제한되지 않은 while 루프를 가질 수는 없습니다. 그러면 주 gtk event loop이 (가) 차단되어 더 이상 이벤트를 처리 할 수 ​​없습니다. 당신이하고 싶은 것은 스레드를 생성하는 것입니다.

GtkButton 대신 ToggleButton을 사용하셨습니까? is_clicked 메소드에 가장 가까운 것은 is_active이며 토글 버튼에서 찾을 수 있습니다.

import gtk, gobject, threading, time 

gobject.threads_init() 

window = gtk.Window() 
button = gtk.ToggleButton('Start Thread') 

class T(threading.Thread): 
    pause = threading.Event() 
    stop = False 

    def start(self, *args): 
     super(T, self).start() 

    def run(self): 
     while not self.stop: 
      self.pause.wait() 
      gobject.idle_add(self.rungui) 
      time.sleep(0.1) 

    def rungui(self): 
     pass # all gui interaction should happen here 

thread = T() 
def toggle_thread(*args): 
    if not thread.is_alive(): 
     thread.start() 
     thread.pause.set() 
     button.set_label('Pause Thread') 
     return 

    if thread.pause.is_set(): 
     thread.pause.clear() 
     button.set_label('Resume Thread') 
    else: 
     thread.pause.set() 
     button.set_label('Pause Thread') 

button.connect('toggled', toggle_thread, None) 

window.add(button) 
button.show() 
window.show() 
gtk.main() 

증명할 수있는이 PyGTK FAQ answer : 여기

은 (정기적 버튼을 원하는 경우 ButtonclickedtriggeredToggleButton 교체) 시작 토글 버튼의 ​​상태에 따라 스레드를 제어의 예 도움이됩니다. 건배.

+0

시작 스레딩을위한 함수를 기존 클래스에 넣을 수 있습니까? 일시 중지없이 시작 및 중지 기능 만 만드는 방법은 무엇입니까? – user1257255

+0

스레드를 중지하려면 간단히'thread.stop = True'를 사용하십시오. 스레드가 종료되면 다시 시작할 수 없습니다 (새 스레드를 만들어야 함). – gvalkov

+0

다른 클래스 및 메서드에서 스레드를 시작하고 싶습니다. 그러나 작동하지 않습니다 - http://pastebin.com/xmHqK6Qc. T.run() 메소드에 데이터를 보내거나 Start 클래스의 메소드를 작성하여이 클래스의 메소드로 스레딩을 시작할 수 있습니까? – user1257255

관련 문제