2016-05-16 16 views
0

Ich arbeite an This web sites tutorials für meine GUI-Anwendung entwerfen, aber ich Gesicht Problem, in how do i could arrest the progress bar updating in clicking the Button StopPython Gtk: Wie könnte ich Knopf-Widget klicken, um eine Funktion geben, für Fortschrittsbalken Update to Kill

Eigentlich sehe ich über Gtk.ProgressBar.set_pulse_step() aber Ich sehe immer noch komisch aus, weil ich kein Experte bin. Hier hat mein Code die Stop-Funktion verpasst.

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 freue ich mich für den richtigen Code von On_clicking_stop() Funktion.

Antwort

0

Die progressbar aktualisiert GObject.timeout_add(50, self.on_timeout, None) mit diesem ist eine Timeout-Funktion, die Anrufe an die angegebene Funktion halten bis False zurückgegeben. Damit die Fortschrittsanzeige nicht mehr aktualisiert wird, müssen Sie on_timeout so ändern, dass False zurückgegeben wird.

Dies kann beispielsweise wie folgt erfolgen:

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