蟒蛇和PyGTK的:停止,而在按一下按钮(Python&PyGTK: Stop while on b

2019-07-02 19:13发布

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

怎么做?

Answer 1:

不幸的是,你不能只是有一个不受约束while循环在你的应用程序的主线程中运行。 这将阻止主GTK事件循环 ,你将不能够处理更多的事件。 你可能想要做的是产生一个线程。

你有没有考虑使用ToggleButton代替GtkButton ? 最接近的事到is_clicked方法是is_active ,你会发现,在切换按钮。

下面是启动和控制依赖于一个切换按钮的状态的线程的例子(替换triggeredclickedToggleButtonButton ,如果你想一个普通的按钮):

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的常见问题的答案也许能派上用场。 干杯。



文章来源: Python&PyGTK: Stop while on button click