Python&PyGTK: Stop while on button click

前端 未结 1 678
一个人的身影
一个人的身影 2021-01-19 17:27

I\'m working on programming some application and I would like to create while loop when button is clicked and if it\'s clicked again to stop it. This is the code for button:

相关标签:
1条回答
  • 2021-01-19 17:49

    Unfortunately, you cannot just have an unconstrained while loop running in the main thread of your application. That would block the main gtk event loop and you won't be able to process any more events. What you probably want to do is spawn a thread.

    Have you considered using a ToggleButton instead of GtkButton? The closest thing to an is_clicked method is is_active and you'll find that in toggle buttons.

    Here's an example of starting and controlling a thread depending on the state of a toggle button (replace triggered with clicked and ToggleButton with Button if you want a regular 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()
    

    This PyGTK FAQ answer might prove helpful. Cheers.

    0 讨论(0)
提交回复
热议问题