2016-05-16 12 views
0

我工作This web sites tutorials設計我的GUI應用程序,但我面對的問題,在how do i could arrest the progress bar updating in clicking the Button Stop的Python的Gtk:我是怎樣把按鈕組件單擊功能殺死進度條更新

其實我看到Gtk.ProgressBar.set_pulse_step()但我仍然看起來很奇怪,因爲我不是專家。 在這裏我的代碼錯過了停止功能。

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()函數的正確代碼。

回答

0

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 
相關問題