2012-10-28 151 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,你將無法處理任何更多的事件。你可能想要做的是產生一個線程。

您是否考慮過使用ToggleButton而不是GtkButton?與is_clicked方法最接近的是is_active,您會在切換按鈕中找到它。

這裏的啓動和控制依賴於一個切換按鈕的狀態的線程的例子(如果你想一個普通按鈕,Button取代triggeredclickedToggleButton):

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可能證明很有幫助。乾杯。

+0

我可以將啓動線程的函數放入現有類嗎?如何創建僅停止啓動和停止功能? – user1257255

+0

要停止線程,只需'thread.stop = True'。請記住,一旦線程終止,它不能再次啓動(您將不得不創建一個新線程)。 – gvalkov

+0

我想從不同的類和方法開始線程化,但我不工作 - http://pastebin.com/xmHqK6Qc。是否可以將數據發送到T.run()方法或在類Start中創建方法以開始使用此類中的方法進行線程化? – user1257255