Seite 1 von 1

Drei in einer Reihe

Verfasst: Sonntag 21. April 2019, 11:21
von erynur
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

Re: Drei in einer Reihe

Verfasst: Sonntag 21. April 2019, 12:16
von Sirius3
@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.

Re: Drei in einer Reihe

Verfasst: Sonntag 21. April 2019, 20:32
von erynur
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?!

Re: Drei in einer Reihe

Verfasst: Sonntag 21. April 2019, 20:43
von __blackjack__
@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.

Re: Drei in einer Reihe

Verfasst: Montag 22. April 2019, 08:46
von erynur
Ah okay, vielen Dank.