我正在编程的一些应用程序,我想在单击按钮时创建while循环,如果它再次单击停止它。 这是按钮的代码:
self.btnThisOne = gtk.Button("This one")
self.btnThisOne.connect("clicked", self.startLoop)
对于startLoop DEF的代码如下:
def startLoop(self):
while self.btnThisOne?(is_clicked)?:
#do something
怎么做?
不幸的是,你不能只是有一个不受约束while循环在你的应用程序的主线程中运行。 这将阻止主GTK事件循环 ,你将不能够处理更多的事件。 你可能想要做的是产生一个线程。
你有没有考虑使用ToggleButton
代替GtkButton
? 最接近的事到is_clicked
方法是is_active
,你会发现,在切换按钮。
下面是启动和控制依赖于一个切换按钮的状态的线程的例子(替换triggered
与clicked
和ToggleButton
与Button
,如果你想一个普通的按钮):
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的常见问题的答案也许能派上用场。 干杯。