4

私はいくつかのアプリケーションのプログラミングに取り組んでおり、ボタンがクリックされたときに 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

どうやってするか?

4

1 に答える 1

3

残念ながら、アプリケーションのメイン スレッドで実行中の while ループを制約なしにすることはできません。これにより、メインのgtk イベント ループがブロックされ、それ以上イベントを処理できなくなります。おそらくやりたいことは、スレッドを生成することです。

ToggleButtonの代わりに を使用することを検討しましたGtkButtonか? is_clickedメソッドに最も近いのis_activeはトグル ボタンです。

トグル ボタンの状態に応じてスレッドを開始および制御する例を次に示します (通常のボタンが必要な場合は、 とに置き換えtriggeredてください)。clickedToggleButtonButton

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 の回答が役立つ場合があります。乾杯。

于 2012-10-28T12:08:57.593 に答える