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 事件循环,您将无法处理更多事件。您可能想要做的是产生一个线程。

您是否考虑过使用 aToggleButton而不是GtkButton?最接近is_clicked方法的是is_active,您会在切换按钮中找到它。

这是一个根据切换按钮的状态启动和控制线程的示例(如果需要常规按钮,请替换triggeredclicked和):ToggleButtonButton

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常见问题解答可能会有所帮助。干杯。

于 2012-10-28T12:08:57.593 回答