Problem bei Wert auslesen und anzeigen

Fragen zu Tkinter.
Antworten
informatics123

Hallo,

ich sitze an der Realisierung des Spiels DueConga
http://www.michas-spielmitmir.de/spiele ... =due_conga

Im labelsteine1 soll angezeigt werden, was in gesamt1 drin steht.
In meinem Label erhalte ich jedoch immer nur die Angabe des Speicherplatzes der Funktion (<function steine1 at 0x0...>)

Hier Auszug aus dem Quelltext, die wohl für den Fehler entscheidend ist.

Code: Alles auswählen

def steine1():

    blau1 = int(labelblau1.cget('text'))
    rot1 = int(labelrot1.cget('text'))
    weiss1 = int(labelweiss1.cget('text'))
    Steine1 = int (labelsteine1.cget('text'))
    Steine1 = rot1 + blau1 + weiss1

labelsteine1 = Label(master=tkFenster,text="0", background="#FF0000")
labelsteine1.place(x=200, y=200, width=300, height=30)
labelsteine1.config(text=str(steine1))
Könnt ihr mir sagen wo der Fehler liegt?


In Hoffnung auf eine positive Antwort,

informatics123
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Funktionen ruft man auf, indem man hinter den Bezeichner Klammern setzt.

Code: Alles auswählen

def sag_etwas(etwas):
    print(etwas)
sag_etwas("Hallo")
Wo genau sind die Klammern bei dem Aufruf von steine1 in der letzten Zeile?

Weiter solltest du Funktionen so bauen, dass du Parameter übergibst und mit dem Rückgabewert weiter arbeitest. Etwas außerhalb der Funktion "magisch" zu verändern lässt sich nur schwer nachvollziehen, es sei denn du bist in einer Klasse, aber das scheint hier nicht der Fall zu sein.
BlackJack

@informatics123: Du solltest Dir ganz schnell diese unsinnige Nummerierung von Namen abgewöhnen. Was soll das? Wenn es nur jeweils einen Namen mit einer angehängten 1 gibt, dann ist das völlig unnötig und wenn man den gleichen Namen mit verschiedenen Nummern hat, dann ist das ein „code smell” der darauf hinweist, dass man hier eigentlich eine Datenstruktur wie eine Liste, ein Tupel, oder ähnliches verwenden sollte.

Noch ein kleiner Nachtrag: Du speicherst die Spieldaten in der GUI — so etwas macht man nicht. Die GUI sollte unabhängig von der Programmlogik sein und nur zur Anzeige und Eingabe von Daten dienen, aber nicht als „Datenstruktur” wo die Programmdaten gespeichert werden. Man kann sonst die GUI nicht austauschen oder verändern, zum Beispiel die `Label` mit den Anzahlen durch eine graphische Repräsentation der Spielsteine ersetzen. Man kann die Programmlogik auch nicht separat, ohne die GUI testen, zum Beispiel um die Einhaltung des Regelwerks zu prüfen.

Insgesamt kann man sagen, dass Du Dich mit der GUI an etwas setzt was mit Deinem Kenntnisstand scheinbar noch etwas zu komplex ist. Für GUIs ist objektorientierte Programmierung eigentlich Voraussetzung, dass heisst ein Vorgehen weit weg von globalen Variablen und durchnummerierten Namen statt Datenstrukturen.

Man sollte solche Programme IMHO bei der Implementierung nicht mit der GUI beginnen, sondern erst einmal mit den Datenstrukturen für die Programmlogik und den Operationen, die man dafür benötigt. Dazu kann ein grafischer Entwurf der GUI nützlich sein an dem man in Gedanken durchspielen kann, welche Operationen und Interaktionen mit dem Benutzer notwendig sind.

Das Spiel eignet sich IMHO auch nicht besonders für eine Umsetzung auf dem Rechner. Im echten Spiel würde man Praktiken anwenden, die sich nur schwer bis gar nicht auf den Rechner übertragen lassen. Es geht ja darum den Gegner abzulenken und zu betrügen. Ein Zug der sicher von Spielern gemacht wird ist das ablegen von Steinen in einer dem Spieler gegenüberliegenden Mulde während er verdeckt in eine ihm zugewandten Mulde auch einen Stein fallen lässt. Wie würdest Du das im Programm abbilden? Und man möchte es dem Gegner natürlich schwerer machen die Regeln zu überprüfen wenn man sie verletzen möchte oder muss, also wird man die Steine nicht fein säuberlich nach Farben soriert in den Mulden anordnen, sondern möglichst vermischt. Also das Gegenteil von der sehr aufgeräumten und leicht zu erfassenden Anzeige in Labels mit Zahlen.

Den `place()`-Layoutmanager sollte man übrigens nicht verwenden. Solche GUIs passen sich nicht den Gegebenheiten auf verschiedenen Rechnern an was im Extremfall nicht nur zu unschönen GUIs führen kann, sondern sogar zu welchen die nicht mehr ordentlich benutzbar sind.
Antworten