不幸的是,你不能只在你的應用程序的主線程中運行一個無約束的while循環。這將阻止主要的gtk event loop,你將無法處理任何更多的事件。你可能想要做的是產生一個線程。
您是否考慮過使用ToggleButton
而不是GtkButton
?與is_clicked
方法最接近的是is_active
,您會在切換按鈕中找到它。
這裏的啓動和控制依賴於一個切換按鈕的狀態的線程的例子(如果你想一個普通按鈕,Button
取代triggered
與clicked
和ToggleButton
):
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可能證明很有幫助。乾杯。
我可以將啓動線程的函數放入現有類嗎?如何創建僅停止啓動和停止功能? – user1257255
要停止線程,只需'thread.stop = True'。請記住,一旦線程終止,它不能再次啓動(您將不得不創建一個新線程)。 – gvalkov
我想從不同的類和方法開始線程化,但我不工作 - http://pastebin.com/xmHqK6Qc。是否可以將數據發送到T.run()方法或在類Start中創建方法以開始使用此類中的方法進行線程化? – user1257255