Python& PyGTK:按下按钮时停止

时间:2012-10-28 10:23:59

标签: python button click while-loop pygtk

我正在编写一些应用程序,我希望在单击按钮时创建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

怎么做?

1 个答案:

答案 0 :(得分:3)

不幸的是,你不能只在应用程序的主线程中运行一个不受约束的while循环。这将阻止主gtk event loop,您将无法再处理任何事件。你可能想要做的是产生一个线程。

您是否考虑过使用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 answer可能会有所帮助。欢呼声。