Oberflächenproblem

Fragen zu Tkinter.
Antworten
Le_cruiser
User
Beiträge: 5
Registriert: Samstag 30. Dezember 2006, 18:35

Hey erstmal,
ich habe das Problem, dass bei meinen programm, wo eine oberfläche mit beinhaltet ist, die Anzeige nicht aktualisiert wird!

das ist meine Oberfläche

[Code ausgelagert.]

---------------------------

Hat jemand ne Lösung wie ich das schaffen könnte???
Ich brauche dringends hilfe!!!

Edit (Leonidas): Code in Python-Tags gesetzt.
Edit (Leonidas): In Tkinter-Forum verschoben.
Edit (Leonidas): Code doch ausgelagert.
BlackJack

Die Daten im Fenster werden nicht aktualisiert weil Du das nirgends machst. Von alleine passiert da nichts. Du musst den Text von jedem Label auf einen neuen Wert setzen. Das geht mit ``label.config(text='neuer text')``.

Da Du die Werte der Labels einmal am Anfang setzt und dann jedesmal wenn Buchstaben gezählt wurden, solltest Du das in eine Funktion schreiben.

Und Du solltest über die Verwendung von Datenstrukturen anstelle von so fürchterlich vielen Namen nachdenken. Die Labels kannst Du zum Beispiel alle in eine Liste stecken und dann in einer Schleife abarbeiten.

Code: Alles auswählen

    labels = list()
    for dummy in xrange(26):
        label = tk.Label(hauptfenster, font=schrift)
        label.pack(side=tk.LEFT)
        labels.append(label)
Jetzt hast Du 26 Labels in einer Liste und kannst eine Funktion schreiben, welche den entsprechenden Text in jedes einträgt.

Wie man sieht habe ich den Quelltext so geschrieben, als wenn `Tkinter` unter dem Namen `tk` importiert wurde. "Sternchenimports" sollte man vermeiden, gerade bei Modulen die soviel Inhalt haben wie GUI Toolkits.

Die Liste mit den Zahlen lässt sich kürzer mit Nullen initialisieren:

Code: Alles auswählen

In [14]: [0] * 10
Out[14]: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Den Text in eine Liste umzuwandeln ist nicht nötig, man kann über die einzelnen Buchstaben mit einer ``for``-Schleife iterieren. Ansonsten kann man die Funktion wesentlich kürzer als ``text2liste = list`` schreiben. :-)

Code: Alles auswählen

In [15]: for c in 'spam':
   ....:     print c
   ....:
s
p
a
m

In [16]: list('spam')
Out[16]: ['s', 'p', 'a', 'm']
In der Funktion `pruefer()` wird versucht dem Ergebnis der Funktion `counter()` ein Ergebnis zuzuweisen -- das geht nicht.

Code: Alles auswählen

In [19]: f() = 42
------------------------------------------------------------
SyntaxError: can't assign to function call
Die Leerzeichen sind teilweise sehr komisch gesetzt. Normalerweise schreibt man eines vor und nach binären Operatoren und Zuweisungen und keines zwischen Namen und Argumenten bei Funktionen und Methoden.

Beim `Rechenknopf` ist ein Fehler beim binden des `command`. Es wird nicht die Funktion `pruefer` sondern das Ergebnis eines Aufrufs dieser Funktion als Kommando an den Knopf gebunden, also eine Liste.

Die Funktion `eingabe()` ist eigentlich nur ein anderer Name für `raw_input()`. Die kann man sich also sparen. Ebenso ist `ausgabe()` ein wenig dünn für eine eigene Funktion.

Bleibt noch die `counter()` Funktion. Die ist viel zu lang und umständlich. Wenn man so programmieren müsste, dann würde es ja keinen Spass mehr machen. Statt einem Namen pro Buchstaben sollte man hier auch eine Liste oder ein Dictionary zum zählen nehmen und den Eingabetext vorher mit der `lower()`-Methode in Kleinbuchstaben umwandeln, dann braucht man nur noch die zählen.
Le_cruiser
User
Beiträge: 5
Registriert: Samstag 30. Dezember 2006, 18:35

ich muss ehrlich gesagt zugeben, dass ich von python nicht viel verstehe, darum habe ich es so gemacht!
Mein Info-lehrer hat uns kaum was erklären können, da er oberflächen erstellen nicht gerne macht und jetzt bin ich dadurch aufgeschmissen!

Was müsste ich ergänzen, wenn ich alles so lasse und Zeile 15 streiche??
(Ich bräuchte es nur funktionsfähig, da leider die Zeit für die Fertigstelltung( morgen ) zuknap ist, daher bleibt mir kaum zeit das neu zumachen)


Ich bedanke mich für deinen Tipp!!
Le_cruiser
User
Beiträge: 5
Registriert: Samstag 30. Dezember 2006, 18:35

gibt es eigentlich noch ne Variante, wo ich alles lassen kann und nur die Zeilen für die Oberflächenaktualisation schreiben kann??

wie und wo müsste ich das machen???
BlackJack

Le_cruiser hat geschrieben:ich muss ehrlich gesagt zugeben, dass ich von python nicht viel verstehe, darum habe ich es so gemacht!
Mein Info-lehrer hat uns kaum was erklären können, da er oberflächen erstellen nicht gerne macht und jetzt bin ich dadurch aufgeschmissen!
Das mit den vielen Namen hat nicht unbedingt etwas mit Oberflächen zu tun. Die `counter()`-Funktion ist ja unabhängig von einer Oberfläche und das mit den Labels eigentlich auch -- die Objekte in eine Liste oder ein Dictionary zu stecken, um nicht so viele Namen immer und immer wieder tippen zu müssen, ist unabhängig davon, um was für Objekte es sich handelt. Code- und Datenstrukturen müsste ein Info-Lehrer auch erklären können wenn er keine GUIs mag. Wenn er keine Programme im allgemeinen mag, wäre er wohl eine Fehlbesetzung. :-)
Was müsste ich ergänzen, wenn ich alles so lasse und Zeile 15 streiche??
Du müsstest den Text in den Labels verändern. Das geht mit der `config()`-Methode von den `Label`-Objekten, wie ich schon schrieb.

Code: Alles auswählen

In [30]: import Tkinter as tk

In [31]: root = tk.Tk()

In [32]: label = tk.Label(root, text='text')

In [33]: label.pack()

In [34]: label.config(text='neuer text')
Antworten