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.
Oberflächenproblem
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.
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:
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. 
In der Funktion `pruefer()` wird versucht dem Ergebnis der Funktion `counter()` ein Ergebnis zuzuweisen -- das geht nicht.
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.
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)
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]

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']
Code: Alles auswählen
In [19]: f() = 42
------------------------------------------------------------
SyntaxError: can't assign to function call
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.
-
- 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!!
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!!
-
- 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???
wie und wo müsste ich das machen???
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.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!

Du müsstest den Text in den Labels verändern. Das geht mit der `config()`-Methode von den `Label`-Objekten, wie ich schon schrieb.Was müsste ich ergänzen, wenn ich alles so lasse und Zeile 15 streiche??
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')