Ahmed Bouabid
Ahmed Bouabid

Reputation: 61

Python Gtk : How could i give Button widget click a function to Kill for progress bar update

I'm working on This web sites tutorials for designing my Gui application, but i face problem, in how do i could arrest the progress bar updating in clicking the Button Stop

Actually i see about Gtk.ProgressBar.set_pulse_step() but i still look strange because i am not expert. Here my code where missed the Stop function.

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GObject

class ProgressBarWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="ProgressBar Demo")
        self.set_border_width(10)

        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
        self.add(vbox)

        self.progressbar = Gtk.ProgressBar()
        vbox.pack_start(self.progressbar, True, True, 0)

        button = Gtk.Button(label="Start")
        button.connect("clicked", self.On_clicking)
        vbox.pack_start(button, True, True, 0)

        button = Gtk.Button(label="Stop")
        button.connect("clicked", self.On_clicking_stop)
        vbox.pack_start(button, True, True, 0)


    def On_clicking(self, widget):
        self.timeout_id = GObject.timeout_add(50, self.on_timeout, None)
        self.activity_mode = False

    def On_clicking_stop(self, widget):
        ## I have to stop the Progress Bar on Stop Button click
        ##
        ##
        ##
        ##
        ##
        return False


    def on_timeout(self, user_data):
        """
        Update value on the progress bar
        """
        if self.activity_mode:
            self.progressbar.pulse()
        else:
            new_value = self.progressbar.get_fraction() + 0.01

            if new_value > 1:
                new_value = 0

            self.progressbar.set_fraction(new_value)

        # As this is a timeout function, return True so that it
        # continues to get called
        return True

win = ProgressBarWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

So i'm looking for the right code of On_clicking_stop() function.

Upvotes: 0

Views: 610

Answers (1)

B8vrede
B8vrede

Reputation: 4532

The progressbar is updated using GObject.timeout_add(50, self.on_timeout, None) this is a timeout function that will keep making calls to the specified function till False is returned. Thus in order to make the progressbar stop updating you will have to change on_timeout in such a way that it returns False.

This can for example be done like this:

def On_clicking(self, widget):
    self.activity_mode = False
    self.updating = True
    self.timeout_id = GObject.timeout_add(50, self.on_timeout, None)


def On_clicking_stop(self, widget):
    self.updating = False
    return True

def on_timeout(self, user_data):
    """
    Update value on the progress bar
    """
    if self.activity_mode:
        self.progressbar.pulse()
    else:
        new_value = self.progressbar.get_fraction() + 0.01

        if new_value > 1:
            new_value = 0

        self.progressbar.set_fraction(new_value)

    # As this is a timeout function, return True so that it
    # continues to get called
    return self.updating

Upvotes: 1

Related Questions