PyGTK - Timeout(超时)

  • 简述

    PyGTK API 的 gobject 模块有一个有用的函数来创建一个将定期调用的超时函数。
    
    source_id = gobject.timeout_add(interval, function, …)
    
    第二个参数是您希望在每毫秒后调用的回调函数,它是第一个参数的值 - 间隔。额外的参数可以作为函数数据传递给回调。
    该函数的返回值为source_id. 使用它,回调函数停止调用。
    
    gobject.source_remove(source_id)
    
    回调函数必须返回 True 才能继续重复。因此,可以通过返回 False 来停止它。
    在下面的程序中,两个按钮和两个标签被放置在一个顶层窗口中。一个标签显示一个递增的数字。btn1 调用on_click它将超时功能设置为 1000 毫秒(1 秒)的间隔。
    
    btn1.connect("clicked", self.on_click)
    def on_click(self, widget):
       self.source_id = gobject.timeout_add(1000, counter, self)
    
    超时函数命名为counter(). 它每 1 秒增加一次标签上的数字。
    
    def counter(timer):
       c=timer.count+1
       print c
       timer.count=c
       timer.lbl.set_label(str(c))
       return True
    
    第二个按钮上的回调删除了超时功能。
    
    btn2.connect("clicked", self.on_stop)
    def on_stop(self, widget):
    gobject.source_remove(self.source_id)
    
  • 例子

    以下是超时示例的完整代码 -
    
    import gtk, gobject
    def counter(timer):
          c = timer.count+1
          print c
          timer.count = c
          timer.lbl.set_label(str(c))
          return True
          class PyApp(gtk.Window):
          
       def __init__(self):
          super(PyApp, self).__init__()
          self.set_title("Timeout Demo")
          self.set_size_request(300, 200)
          self.set_position(gtk.WIN_POS_CENTER)
          
          vbox = gtk.VBox(False, 5)
          hbox = gtk.HBox(True, 3)
          
          hb = gtk.HBox()
          lbl1 = gtk.Label("Counter: ")
          
          hb.add(lbl1)
          self.lbl = gtk.Label("")
          hb.add(self.lbl)
          valign = gtk.Moognment(0.5, 0.5, 0, 0)
          valign.add(hb)
          vbox.pack_start(valign, True, True, 10)
          
          btn1 = gtk.Button("start")
          btn2 = gtk.Button("stop")
          
          self.count = 0
          self.source_id = 0
          
          hbox.add(btn1)
          hbox.add(btn2)
          
          halign = gtk.Moognment(0.5, 0.5, 0, 0)
          halign.add(hbox)
          
          vbox.pack_start(halign, False, True, 10)
          self.add(vbox)
          
          btn1.connect("clicked", self.on_click)
          btn2.connect("clicked", self.on_stop)
          
          self.connect("destroy", gtk.main_quit)
          self.show_all()
          
       def on_click(self, widget):
          self.source_id = gobject.timeout_add(1000, counter, self)
          
       def on_stop(self, widget):
          gobject.source_remove(self.source_id)
    PyApp()
    gtk.main()
    
    执行时,窗口底部显示两个按钮。当点击开始按钮时标签上的数字会周期性地增加,当点击停止按钮时它会停止增加。
    观察输出 -
    超时演示