PyGTK - Hết giờ

Mô-đun gobject của API PyGTK có một chức năng hữu ích để tạo một hàm thời gian chờ sẽ được gọi định kỳ.

source_id = gobject.timeout_add(interval, function, …)

Đối số thứ hai là hàm gọi lại mà bạn muốn gọi sau mỗi mili giây, là giá trị của đối số đầu tiên - khoảng thời gian. Các đối số bổ sung có thể được chuyển tới lệnh gọi lại dưới dạng dữ liệu hàm.

Giá trị trả về của hàm này là source_id. Sử dụng nó, chức năng gọi lại bị dừng gọi.

gobject.source_remove(source_id)

Hàm callback phải trả về True để tiếp tục lặp lại. Do đó, nó có thể được dừng lại bằng cách trả về False.

Hai nút và hai nhãn được đặt trên một cửa sổ cấp cao nhất trong chương trình sau. Một nhãn hiển thị một số tăng dần. Btn1 gọion_click trong đó đặt chức năng thời gian chờ với khoảng thời gian 1000 ms (1 giây).

btn1.connect("clicked", self.on_click)

def on_click(self, widget):
   self.source_id = gobject.timeout_add(1000, counter, self)

Chức năng thời gian chờ được đặt tên là counter(). Nó tăng số lượng trên nhãn sau mỗi 1 giây.

def counter(timer):
   c=timer.count+1
   print c
   timer.count=c
   timer.lbl.set_label(str(c))
   return True

Nút Gọi lại trên nút thứ hai loại bỏ chức năng thời gian chờ.

btn2.connect("clicked", self.on_stop)
def on_stop(self, widget):
gobject.source_remove(self.source_id)

Thí dụ

Sau đây là mã hoàn chỉnh cho ví dụ Thời gian chờ:

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

Khi thực thi, cửa sổ hiển thị hai nút ở phía dưới. Số trên nhãn sẽ tăng theo định kỳ khi nhấp vào nút Bắt đầu và sẽ ngừng tăng khi nhấp vào nút Dừng.

Quan sát đầu ra -