Farbe des Labels während ProgTkinter Python Raspberry Wheezy

Fragen zu Tkinter.
Antworten
raspistefan
User
Beiträge: 3
Registriert: Mittwoch 4. März 2015, 15:20

Hallo Python-Freunde,

ich möchte die Textfarbe eines Labels (fg) während des Programmablaufes verändern. Hintergrund ist, dass ich im Normalfall den Text 'o.k.' in blauer Farbe anzeigen möchte und im Alarmfalle den Text 'Alarm' in roter Schriftfarbe.
Das Ganze mit Python 2.7/Tkinter auf einem Raspberry mit Wheezy.
Das dynamische Ändern des Textes habe ich leicht hinbekommen (mit .set). Die Foreground-Farbe dynamisch zu ändern, schaffe ich noch nicht. Mit Google habe ich zwar einige Vorschläge gefunden, aber die sind wohl alle nicht für den Raspberry. Zumindest hat das noch nicht geklappt.
Ich hatte mir so etwas vorgestellt:

Code: Alles auswählen

from Tkinter import *
...
farbe=StringVar()  # Variable farbe definieren
farbe.set("blue")   # Anfangsfarbe
...
def unterprogramm():
  ..
  if .. == "Alarm":
      farbe.set("red")     # rot
  else:
       farbe.set("blue")   # blau

..
textfeld=Label(root,textvariable=meinstring,fg=farbe.get()).grid(row=9),column=2)

root.mainloop()
Ich hoffe, ich konnte darstellen, was ich meine ..
Irgendwie hakt es noch. Könntet Ihr mir bitte auf die Sprünge helfen, wie ich so etwas auf dem Raspberry hinbekommen kann?
Vielen Dank
Stefan
BlackJack

@raspistefan: Man kann nicht `StringVar`-Exemplare bei jedem Argument übergeben. Wobei Du das ja noch nicht einmal tust sondern den Rückgabewert von der `get()`-Methode, was eine ganz normale Zeichenkette ist, und die hat keine Ahnung wo sie herkommt, und ändern tut die sich schon gar nicht wenn man irgendwo anders im Programm den Zustand eines `StringVar`-Objektes geändert hat. Zeichenketten sind unveränderbar in Python.

Um die Farbe zu ändern musst Du beim `Label`-Exemplar die Farbe ändern. Entweder mit der `config()`- oder `configure()`-Methode oder über eine Zuweisung per Indexzugriff mit entsprechendem Schlüssel oder Wert.

Ich glaube auch nicht das etwas was allgemein bei Tk funktioniert ausgerechnet auf dem Raspberry nicht funktioniert. Da läuft in der Regel ein ganz normales Linux.

Den Sternchenimport solltest Du sein lassen und auf Modulebene sollten nur Konstanten, Funktionen, und Klassen definiert werden. Auch das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Dann ergibt sich auch zwangsläufig das alles was Funktionen und Methoden ausser Konstanten so benötigen als Argument übergeben wird.
raspistefan
User
Beiträge: 3
Registriert: Mittwoch 4. März 2015, 15:20

Hallo BlackJack,

schade, mit dem eigentlichen Text funktioniert es so schön einfach. Das sind doch auch Strings..? Wieso funktioniert das da?
Als ich Varianten mit config() oder configure() versucht habe, kam die Meldung, dass mein Label die Methode config bzw. configure nicht kennt :-(
Es wäre schön, wenn jemand ein Beispiel hätte, wie es enfach geht. Oder einen guten/für mich einfach verständlichen Link.
Vielen Dank
Stefan
BlackJack

@raspistefan: Das Funktioniert beim Text weil dort der Code entweder eine Zeichenkette oder eben ein `StringVar`-Exemplar erwartet. Bei anderen Argumenten als denen wo das Dokumentiert ist eben nicht.

Dein `Label`-Exemplar kennt diese Methoden ganz bestimmt. Allerdings hast Du da auch nirgends ein `Label`-Exemplar an einen Namen gebunden. `textfeld` wird an den Rückgabewert von der `grid()`-Methode gebunden, und da der immer `None` ist, macht das überhaupt keinen Sinn.
raspistefan
User
Beiträge: 3
Registriert: Mittwoch 4. März 2015, 15:20

Danke BlackJack.
Nun weiß ich, dass ich praktisch alles falsch habe und dass es für einen Experten kein Wunder ist, dass es nicht geht.
Wenn irgendjemand das Ganze für mich als Tkinter-Einsteiger konstruktiv anhand eines Beispiels darstellen könnte, dann wäre das perfekt.

Edit: Ich habe es jetzt gelöst. Ich war gar nicht so weit von einer Lösung entfernt. Die Verwirrung durch Fachbegriffe wäre gar nicht nötig gewesen. :wink:
Antworten