PyGTK - Zeitüberschreitung
Das Gobject-Modul der PyGTK-API verfügt über eine nützliche Funktion zum Erstellen einer Timeout-Funktion, die regelmäßig aufgerufen wird.
source_id = gobject.timeout_add(interval, function, …)
Das zweite Argument ist die Rückruffunktion, die Sie nach jeder Millisekunde aufrufen möchten. Dies ist der Wert des ersten Argumentintervalls. Zusätzliche Argumente können als Funktionsdaten an den Rückruf übergeben werden.
Der Rückgabewert dieser Funktion ist source_id. Dadurch wird die Rückruffunktion vom Aufrufen abgehalten.
gobject.source_remove(source_id)
Die Rückruffunktion muss True zurückgeben, um die Wiederholung fortzusetzen. Daher kann es durch Rückgabe von False gestoppt werden.
Im folgenden Programm werden zwei Schaltflächen und zwei Beschriftungen in einem Fenster auf oberster Ebene platziert. Ein Etikett zeigt eine inkrementelle Nummer an. Das btn1 ruft aufon_click Hiermit wird die Timeout-Funktion mit einem Intervall von 1000 ms (1 Sekunde) eingestellt.
btn1.connect("clicked", self.on_click)
def on_click(self, widget):
self.source_id = gobject.timeout_add(1000, counter, self)
Die Timeout-Funktion heißt counter(). Die Nummer auf einem Etikett wird alle 1 Sekunde erhöht.
def counter(timer):
c=timer.count+1
print c
timer.count=c
timer.lbl.set_label(str(c))
return True
Der Rückruf auf der zweiten Taste entfernt die Timeout-Funktion.
btn2.connect("clicked", self.on_stop)
def on_stop(self, widget):
gobject.source_remove(self.source_id)
Beispiel
Das Folgende ist der vollständige Code für das Timeout-Beispiel -
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()
Bei der Ausführung werden im Fenster unten zwei Schaltflächen angezeigt. Die Zahl auf dem Etikett wird regelmäßig erhöht, wenn auf die Schaltfläche Start geklickt wird, und wird nicht mehr erhöht, wenn auf die Schaltfläche Stopp geklickt wird.
Beobachten Sie die Ausgabe -