Drei in einer Reihe

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
erynur
User
Beiträge: 6
Registriert: Donnerstag 11. April 2019, 13:46

Hi,

ich habe mir als erstes "kleines" GUI Programm "Drei in einer Reihe" ausgesucht.

https://pastebin.com/WC0rzRfF

Hat mir auch sehr viel Spass gemacht, vor allem den Code von knapp über
500 Zeilen auf die jetzt aktuellen ca. 200 zu reduzieren.

Eine Sache nervt mich allerdings noch, und ich habe irgendwie eine Blockade den richtigen
Ansatz zu finden ohne alles komplett umschreiben zu müssen.

Worum es mir geht ist die Abfrage der Gewinner, genauer gesagt des unentschieden.
Es sieht so schön nach einer in Schleife abfragbaren Codepassage aus,
aber es will mir einfach nicht gelingen.

Ich möchte die Aufgabe nicht von euch gelöst bekommen, aber vielleicht kann mir ja
jemand einen Denkanstoß geben.

Vielen Dank schonmal im voraus
"""
Code by: erynur
Contact: erynur0@gmail.com

Feel free to use this code for personal or educational purpose
"""
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

@erynur: __init__ ist dazu da, eine Instanz zu initialisieren, nicht um darin die ganze Arbeit zu machen, denn so arbeitest Du die ganze Zeit mit einem nicht vollständig initialisierten Objekt: das mainloop gehört nicht in __init__.
`quit_application` ruft eine nicht vorhandene Funktion `quit` auf.
In `create_grid` gibt es viele `pass` die völlig überflüssig sind. `i` kann man auch einfach aus j und k berechnen. Obwohl, die erste Schleife und damit `i`ist eigentlich auch nicht nötig.

Code: Alles auswählen

    def create_grid(self):
        for j in range(3):
            for k in range(3):
                frame = Frame(self.root)
                frame.grid(row=j, column=k, padx=2, ipadx=19, ipady=25)
                frame.propagate(False)
                self.frame_list.append(frame)
Genauso in `create_label` ist der Index unnötig:

Code: Alles auswählen

    def create_label(self):
        for frame in self.frame_list:
            var = StringVar()
            var.set('?')
            label = Label(frame, textvariable=var)
            label.pack(side='top')
            self.label_text_list.append(var)
            self.label_list.append(label)
Die for-Schleifen in den anderen Funktionen umzuschreiben, überlasse ich Dir.
In `is_won` verwendest Du & falsch. Boolsches und ist `and`.
Die viele Code-Dopplunge vermeidet man, indem man die Unterschiede in den gleich Aussehenden Zeilen durch Variablen ersetzt und den eigentlichen Code in eine Funktion auslagert.
erynur
User
Beiträge: 6
Registriert: Donnerstag 11. April 2019, 13:46

Wow, vielen Dank.
Da hab ich wohl noch viel zu verbessern :/

Vieles davon habe ich direkt verstanden, über einiges muss ich noch nachdenken, aber eine Frage hätte ich direkt noch:

Anstatt "quit" zu benutzen, wie schließt man denn ein Programm "ordentlich"?
"quit" tut nämlich genau was es soll?!
"""
Code by: erynur
Contact: erynur0@gmail.com

Feel free to use this code for personal or educational purpose
"""
Benutzeravatar
__blackjack__
User
Beiträge: 14042
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@erynur: Man ruft die `quit()`-Methode auf einem Tk-Widget auf. Die `quit()`-Funktion die Du da aufrufst mag genau das tun was sie soll, nur gibt es sie nicht offiziell, das ist also Zufall.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
erynur
User
Beiträge: 6
Registriert: Donnerstag 11. April 2019, 13:46

Ah okay, vielen Dank.
"""
Code by: erynur
Contact: erynur0@gmail.com

Feel free to use this code for personal or educational purpose
"""
Antworten