PyGTK - Batas waktu
Modul gobject dari PyGTK API memiliki fungsi yang berguna untuk membuat fungsi batas waktu yang akan dipanggil secara berkala.
source_id = gobject.timeout_add(interval, function, …)
Argumen kedua adalah fungsi panggilan balik yang ingin Anda panggil setelah setiap milidetik yang merupakan nilai dari argumen pertama - interval. Argumen tambahan dapat diteruskan ke callback sebagai data fungsi.
Nilai kembalian dari fungsi ini adalah source_id. Dengan menggunakannya, fungsi panggilan balik dihentikan dari panggilan.
gobject.source_remove(source_id)
Fungsi panggilan balik harus mengembalikan True agar dapat terus berulang. Oleh karena itu, ini bisa dihentikan dengan mengembalikan False.
Dua tombol dan dua label diletakkan di jendela tingkat atas di program berikut. Satu label menampilkan angka yang bertambah. Panggilan btn1on_click yang menyetel fungsi batas waktu dengan interval 1000 ms (1 detik).
btn1.connect("clicked", self.on_click)
def on_click(self, widget):
self.source_id = gobject.timeout_add(1000, counter, self)
Fungsi batas waktu dinamai sebagai counter(). Ini menambah angka pada label setelah setiap 1 detik.
def counter(timer):
c=timer.count+1
print c
timer.count=c
timer.lbl.set_label(str(c))
return True
Callback pada tombol kedua menghilangkan fungsi batas waktu.
btn2.connect("clicked", self.on_stop)
def on_stop(self, widget):
gobject.source_remove(self.source_id)
Contoh
Berikut ini adalah kode lengkap untuk contoh Timeout -
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()
Saat dijalankan, jendela menunjukkan dua tombol di bagian bawah. Angka pada label akan bertambah secara berkala ketika tombol Start diklik dan akan berhenti bertambah ketika tombol Stop diklik.
Perhatikan hasilnya -