Probleme Mit dem ersten Programm

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
MebusValle
User
Beiträge: 2
Registriert: Mittwoch 13. Mai 2015, 21:10

hay ich bin zz an einem projekt dran, ein würfel. eigentlich soll das bild immer wieder erneuert werden aber sie tauchen einfach immer untereinander auf, ich glaube das hat was mit main.mainloop() zutun ich weiß es aber nicht. hier der quellcode

Code: Alles auswählen

import tkinter
import random

random.seed()

def ENDE():
    main.destroy()
def START():

        augen = random.randint(1,6)
        if augen == 1:
            im = tkinter.PhotoImage(file="W-1.gif")
        elif augen == 2:
            im = tkinter.PhotoImage(file="W-2.gif")
        elif augen == 3:
            im = tkinter.PhotoImage(file="W-3.gif")
        elif augen == 4:
            im = tkinter.PhotoImage(file="W-4.gif")
        elif augen == 5:
            im = tkinter.PhotoImage(file="W-5.gif")
        elif augen == 6:
            im = tkinter.PhotoImage(file="W-6.gif") 
        lb1 = tkinter.Label(main)
        lb1["image"] = im
        lb1.pack()
        main.mainloop()

main=tkinter.Tk()

c = tkinter.Button(main, text = "START", command = START)
c.pack()

b = tkinter.Button(main, text = "ENDE", command = ENDE)
b.pack()
Zuletzt geändert von Anonymous am Mittwoch 13. Mai 2015, 21:46, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@MebusValle: wenn Du das Bild ersetzen willst, darfst Du keine neuen Labels erzeugen.
BlackJack

@MebusValle: Der `seed()`-Aufruf ist sinnfrei. Hier schadet er auch nicht, aber in bestimmten Situationen kann das auch für *weniger* (Pseudo)zufall sorgen. Also weg damit.

Die `mainloop()` ist *die* Hauptschleife, die darf man nur einmal aufrufen (es sei denn man weiss sehr genau was man da tut) und nicht jedes mal eine neue Hauptschleife starten wenn der Benutzer auf eine Schaltfläche klickt. Wobei das Programm so auch gar nicht läuft weil es sofort wieder beendet wird. Es kann also höchstens sein dass Du das aus einer IDE startest die das verhindert und sich das Programm damit anders verhält als würde es alleine gestartet.

Die Schreibweise von `START` und `ENDE` entspricht nicht dem Style Guide for Python Code genau wie die Einrücktiefe die vier Leerzeichen pro Ebene sein sollte.

`ENDE()` könnte man sich ausserdem sparen, denn die eine Funktion/Methode die darin aufgerufen wird hätte man auch gleich direkt als `command` übergeben können.

Die ganze ``if``/``elif``-Kaskade ist ziemlich umständlich; der einzige Unterschied zwischen den Zweigen ist eine Ziffer im Dateinamen und das ist auch noch die Zahl auf die getestet wird. Das ginge wesentlich einfacher wenn man den Dateinamen durch Zeichenkettenformtierung erstellt in dem man die Ziffer in den Dateinamen formtiert. Man könnte auch alle Bilder erstellen und in einer Liste ablegen und dann per `random.choice()` zufällig eines aussuchen.

Namen sollten dem Leser vermitteln was der Wert dahinter im Kontext des Programms bedeutet und nicht aus nichtssagenden Einzelbuchstaben bestehen oder aus kryptischen Kürzeln, dazu noch mit sinnlosen Zahlen angehängt.

Funktionen sind eigentlich als „black box” gedacht wo man Werte als Argumente hinein steckt und gegebenfalls einen Wert als Rückgabewert zurück bekommt. Deshalb sollten Funktionen ausser auf Konstanten nur Werte verwenden die als Argumente übergeben wurden. Beide Funktionen greifen aber einfach so auf `main` zu, was hier nicht wie üblich die Hauptfunktion ist, sondern das Tk-Hauptfenster.

Wenn das Hauptprogramm in einer Funktion steckt und auf Modulebene nur Konstanten, Funktionen, und Klassen definiert werden, kommt auch erst gar nicht in Versuchung in Funktionen auf irgendwelche Modulglobalen Werte zuzugreifen.

Bei GUI-Programmierung muss man im Grunde schon objektorientierte Programmierung anwenden, also selber Klassen schreiben, denn sonst bekommt man nicht-triviale Programme, und dazu gehört das hier schon, technisch nicht sauber umgesetzt.
MebusValle
User
Beiträge: 2
Registriert: Mittwoch 13. Mai 2015, 21:10

oh man das ist jetzt viel auf einmal, ich danke euch für die schnellen antworten und werde das programm noch mal überdenken. und auch danke für die ganzen tipps ich werde noch mal eine antwort mit dem neuen programm schicken :)
Antworten