2012-10-28 154 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