Python Gtk:我如何给Button小部件单击一个函数来杀死进度条更新

时间:2016-05-16 21:38:15

标签: python pygtk gtk3

我正在This web sites tutorials设计我的Gui应用程序,但我遇到问题,在how do i could arrest the progress bar updating in clicking the Button Stop

实际上我看到了Gtk.ProgressBar.set_pulse_step(),但我仍然看起来很奇怪,因为我不是专家。 这里我的代码错过了Stop函数。

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()

所以我正在寻找On_clicking_stop()函数的正确代码。

1 个答案:

答案 0 :(得分:1)

使用progressbar更新GObject.timeout_add(50, self.on_timeout, None)这是一个超时函数,它将继续调用指定的函数,直到返回False为止。因此,为了使进度条停止更新,您必须以返回on_timeout的方式更改False

例如可以这样做:

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