Label im applet aktualisieren?

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Die Callback-Funktion muss "True" zurück geben, damit sie erneut ausgelöst wird. Außerdem kann man timeout_add() weitere Parameter übergeben, die dann auch an die Callback-Funktion durchgereicht werden. So spart man sich bspw. die globale label-Variable.

Besten Gruß,

brb
Arp
User
Beiträge: 65
Registriert: Dienstag 15. März 2011, 13:21

Danke, aber das bringts auch nicht.... scheinbar bedarf es hier wirklich einer redraw befehl da ansonsten der einmal geschriebene Text auf teufel komm raus sich nicht ändert.
BlackJack

@Arp: Also ich brauche hier keinen redraw-Befehl. Es wäre vielleicht hilfreich wenn Du mal ein funktionierendes Minimalbeispiel zeigen würdest.

Code: Alles auswählen

from itertools import count
import gobject
import gtk


def main():
    def destroy(window):
        window.hide()
        gtk.main_quit()
    
    window = gtk.Window()
    window.connect('destroy', destroy)
    
    label = gtk.Label()
    label.set_text('-')
    window.add(label)
    
    def set_label_counter(counter):
        label.set_text(str(counter.next()))
        return True
        
    gobject.timeout_add_seconds(1, set_label_counter, count())
    
    window.show_all()
    gtk.main()


if __name__ == '__main__':
    main()
Arp
User
Beiträge: 65
Registriert: Dienstag 15. März 2011, 13:21

@Blackjack

Ich glaube es macht wohl einen unterschied ob man ein gnome applet schreibt oder ein "richtiges" programm.

Das ist das letzte was ich probiert habe, und es führt nur dazu das im gnome panel eine 0 steht, und sich dann nichts tut.

Code: Alles auswählen

zahl = 0
label = gtk.Label(str(zahl))

def timer_callback():
	global zahl,label
	zahl+=1
	label.set_text(str(zahl))
	return True

def factory(applet, iid):
	global label,zahl		
	label = gtk.Label(str(zahl))
	applet.add(label)
	applet.show_all()
	gobject.timeout_add(1,timer_callback,applet)	
	return True


if __name__ == '__main__':
	print "Starting factory"	
	gnomeapplet.bonobo_factory("OAFIID:Gnome_Panel_Example_Factory", gnomeapplet.Applet.__gtype__, "Simple gnome applet example", "1.0", factory)
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Deinen Code kann man ja mit 2, 3 Änderungen so abändern, dass er ein normales Fenster erzeugt. Und dann funktioniert er immer noch nicht, was deine These in Frage stellt.

Stellen wir uns also die Frage, warum dein Code nicht funktioniert. Und da fällt die Funktion "timer_callback" ins Auge. Du über gibst "gobject.timeout_add" den Zusatz-Parameter "applet". Die Callback-Funktion kennt aber keine Parameter und schmeißt daher den Fehler

Code: Alles auswählen

TypeError: timer_callback() takes no arguments (1 given)
^CTraceback (most recent call last):
  File "tst.py", line 23, in <module>
    gtk.main()
KeyboardInterrupt
Wenn du den Fehler behebst, geht auch dein Code.

Gruß,

brb
Arp
User
Beiträge: 65
Registriert: Dienstag 15. März 2011, 13:21

Das mit dem applet in der Übergabe war nur ne idee von mir... Aber auch ohne, funktioniert es nicht. Ich krieg zwar keinen Fehler, der Code an sich läuft, aber das Label im Panel wird trotzdem nicht geändert. Es bleibt stehts bei 0 stehen.
Arp
User
Beiträge: 65
Registriert: Dienstag 15. März 2011, 13:21

Ich hab das jetzt mal mit gnome als panel aufgegeben. Das neu zeichnen des Labels krieg ich einfach nicht hin. Hab stattdessen ein kleines prog mit tkinter erstellt. das hat prima funktioniert. Danke :)
Antworten