残念ながら、アプリケーションのメイン スレッドで実行中の 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 FAQ の回答が役立つ場合があります。乾杯。