Schleife bilden

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
Tom12
User
Beiträge: 32
Registriert: Mittwoch 17. Januar 2018, 17:38

Sonntag 4. März 2018, 20:50

So hier bin ich wieder einmal mit einer echt einfachen Frage :D allerdings komm ich einfach nicht auf die Lösung, da ich ziemlich verpeilt bin :K .
Ich habe 9 Buttons (tkinter) diese haben einen Command, wenn er geklickt wird, dass die int() richtige + 1 gezählt wird.
Nun möchte ich eine Schleife einfügen, wenn richtige = 8 ist, soll er eine Messagebox erstellen. Mit welcher Art Schleife soll ich das machen ?

Vielen Dank im voraus
__deets__
User
Beiträge: 3998
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sonntag 4. März 2018, 20:57

Ich verstehe fast nur Bahnhof. Kannst du mal deinen Code zeigen? Und wenn "richtige" eine Variable ist, und du pruefen moechtest, dass die einen Wert hat, und dann etwas tun, dann benutzt man dazu keine Schleife. Sondern eine if-Anweisung.
Tom12
User
Beiträge: 32
Registriert: Mittwoch 17. Januar 2018, 17:38

Sonntag 4. März 2018, 20:58

Es soll ein Minesweeper Spiel werden und ich wollte es komplett ohne Tutorial selbst probieren deshalb ist es sehr chaotisch, da es mein erstes Projekt ist

Code: Alles auswählen

import tkinter
import random
import time
from tkinter import messagebox
from functools import partial

# Fenster erschaffen
root = tkinter.Tk()
root.title("Minesweeper")
root.minsize(width=700, height=260)

#Richtige Zählen
Right = tkinter.IntVar()
Right.set(0)
richtige = int()

#random
random.seed()
Bomb = random.randint(2,2)

#Spiel schließen Def VERLIEREN
def destr():
    if messagebox.showinfo("Exit", "Sie haben verloren, drücken Sie Ok um das Spiel zu beenden"):
        root.destroy()

#Spiel schließen Def GEWINNEN
while richtige == 8:
    print(richtige)
    messagebox.showinfo("Exit", "Herzlichen Glückwunsch Sie haben  gewonnen")
    root.destroy()


#Bomben abfragen
def Bomben1():
    global richtige
    if Bomb == 1:
        print("Game Over")
        Button1.config(state= tkinter.DISABLED)
        Bild2 = tkinter.PhotoImage(file="Bombe2.png")
        ww1 = tkinter.Label(root, image=Bild2)
        ww1.image = Bild2
        ww1.place(x=0, y=0)
        destr()
    else:
        print("Glück gehabt")
        Right.set(Right.get()+1)
        Button1.config(state= tkinter.DISABLED)
        root.update()
        Bild1 = tkinter.PhotoImage(file="wiese.png")
        w1 = tkinter.Label(root, image=Bild1)
        w1.image = Bild1
        w1.place(x=0, y=0)
        richtige = richtige + 1
        print(richtige)


def Bomben2():
    global richtige
    if Bomb == 2:
        print("Game Over")
        Button2.config(state= tkinter.DISABLED)
        Bild2 = tkinter.PhotoImage(file="Bombe2.png")
        ww2 = tkinter.Label(root, image=Bild2)
        ww2.image = Bild2
        ww2.place(x=80, y=0)
        destr()
    else:
        print("Glück gehabt")
        Right.set(Right.get()+1)
        Button2.config(state= tkinter.DISABLED)
        root.update()
        Bild1 = tkinter.PhotoImage(file="wiese.png")
        w2 = tkinter.Label(root, image=Bild1)
        w2.image = Bild1
        w2.place(x=80, y=0)
        richtige = richtige + 1
        print(richtige)

def Bomben3():
    global richtige
    if Bomb == 3:
        print("Game Over")
        Button3.config(state= tkinter.DISABLED)
        Bild2 = tkinter.PhotoImage(file="Bombe2.png")
        ww3 = tkinter.Label(root, image=Bild2)
        ww3.image = Bild2
        ww3.place(x=160, y=0)
        destr()
    else:
        print("Glück gehabt")
        Right.set(Right.get()+1)
        Button3.config(state= tkinter.DISABLED)
        root.update()
        Bild1 = tkinter.PhotoImage(file="wiese.png")
        w3 = tkinter.Label(root, image=Bild1)
        w3.image = Bild1
        w3.place(x=160, y=0)
        richtige = richtige + 1
        print(richtige)

def Bomben4():
    global richtige
    if Bomb == 4:
        print("Game Over")
        Button4.config(state= tkinter.DISABLED)
        Bild2 = tkinter.PhotoImage(file="Bombe2.png")
        ww4 = tkinter.Label(root, image=Bild2)
        ww4.image = Bild2
        ww4.place(x=0, y=87)
        destr()
    else:
        print("Glück gehabt")
        Right.set(Right.get()+1)
        Button4.config(state= tkinter.DISABLED)
        root.update()
        Bild1 = tkinter.PhotoImage(file="wiese.png")
        w4 = tkinter.Label(root, image=Bild1)
        w4.image = Bild1
        w4.place(x=0, y=87)
        richtige = richtige + 1
        print(richtige)

def Bomben5():
    global richtige
    if Bomb == 5:
        print("Game Over")
        Button5.config(state= tkinter.DISABLED) 
        Bild2 = tkinter.PhotoImage(file="Bombe2.png")
        ww5 = tkinter.Label(root, image=Bild2)
        ww5.image = Bild2
        ww5.place(x=80, y=87)
        destr()
    else:
        print("Glück gehabt")
        Right.set(Right.get()+1)
        Button5.config(state= tkinter.DISABLED)
        root.update()
        Bild1 = tkinter.PhotoImage(file="wiese.png")
        w5 = tkinter.Label(root, image=Bild1)
        w5.image = Bild1
        w5.place(x=80, y=87)
        richtige = richtige + 1
        print(richtige)

def Bomben6():
    global richtige
    if Bomb == 6:
        print("Game Over")
        Button6.config(state= tkinter.DISABLED)
        Bild2 = tkinter.PhotoImage(file="Bombe2.png")
        ww6 = tkinter.Label(root, image=Bild2)
        ww6.image = Bild2
        ww6.place(x=160, y=87)
        destr()
    else:
        print("Glück gehabt")
        Right.set(Right.get()+1)
        Button6.config(state= tkinter.DISABLED)
        root.update()
        Bild1 = tkinter.PhotoImage(file="wiese.png")
        w6 = tkinter.Label(root, image=Bild1)
        w6.image = Bild1
        w6.place(x=160, y=87)
        richtige = richtige + 1
        print(richtige)

def Bomben7():
    global richtige
    if Bomb == 7:
        print("Game Over")
        Button7.config(state= tkinter.DISABLED)
        Bild2 = tkinter.PhotoImage(file="Bombe2.png")
        ww7 = tkinter.Label(root, image=Bild2)
        ww7.image = Bild2
        ww7.place(x=0, y=174)
        destr()
    else:
        print("Glück gehabt")
        Right.set(Right.get()+1)
        Button7.config(state= tkinter.DISABLED)
        root.update()
        Bild1 = tkinter.PhotoImage(file="wiese.png")
        w7 = tkinter.Label(root, image=Bild1)
        w7.image = Bild1
        w7.place(x=0, y=174)
        richtige = richtige + 1
        print(richtige)

def Bomben8():
    global richtige
    if Bomb == 8:
        print("Game Over")
        Button8.config(state= tkinter.DISABLED)
        Bild2 = tkinter.PhotoImage(file="Bombe2.png")
        ww8 = tkinter.Label(root, image=Bild2)
        ww8.image = Bild2
        ww8.place(x=80, y=174)
        destr()
    else:
        print("Glück gehabt")
        Right.set(Right.get()+1)
        Button8.config(state= tkinter.DISABLED)
        root.update()
        Bild1 = tkinter.PhotoImage(file="wiese.png")
        w8 = tkinter.Label(root, image=Bild1)
        w8.image = Bild1
        w8.place(x=80, y=174)
        richtige = richtige + 1
        print(richtige)

def Bomben9():
    global richtige
    if Bomb == 9:
        print("Game Over")
        Button9.config(state= tkinter.DISABLED)
        Bild2 = tkinter.PhotoImage(file="Bombe2.png")
        ww9 = tkinter.Label(root, image=Bild2)
        ww9.image = Bild2
        ww9.place(x=160, y=174)
        destr()
    else:
        print("Glück gehabt")
        Right.set(Right.get()+1)
        Button9.config(state= tkinter.DISABLED)
        root.update()
        Bild1 = tkinter.PhotoImage(file="wiese.png")
        w5 = tkinter.Label(root, image=Bild1)
        w5.image = Bild1
        w5.place(x=160, y=174)
        richtige = richtige + 1
        print(richtige)
        
# Buttons erschaffen

Button1 = tkinter.Button(root, text="", command=Bomben1, height = 5, width = 10)
Button1.grid(row=1, column=0)

Button2 = tkinter.Button(root, text="", command=Bomben2, height = 5, width = 10)
Button2.grid(row=1, column=1)

Button3 = tkinter.Button(root, text="", command=Bomben3, height = 5, width = 10)
Button3.grid(row=1, column=2)

Button4 = tkinter.Button(root, text="", command=Bomben4, height = 5, width = 10)
Button4.grid(row=2, column=0)

Button5 = tkinter.Button(root, text="", command=Bomben5, height = 5, width = 10)
Button5.grid(row=2, column=1)

Button6 = tkinter.Button(root, text="", command=Bomben6, height = 5, width = 10)
Button6.grid(row=2, column=2)

Button7 = tkinter.Button(root, text="", command=Bomben7, height = 5, width = 10)
Button7.grid(row=3, column=0)

Button8 = tkinter.Button(root, text="", command=Bomben8, height = 5, width = 10)
Button8.grid(row=3, column=1)

Button9 = tkinter.Button(root, text="", command=Bomben9, height = 5, width = 10)
Button9.grid(row=3, column=2)

#Labels
Headline = tkinter.Label(root, text="Minesweeper", font="Courier 16 bold")
Headline.place(x=420,y=15)
Infos = tkinter.Label(root, text="In 9 Feldern befindet sich 1 Bombe das Ziel ist,")
Infos.place(x=380, y=35)
Infos2 = tkinter.Label(root, text="soviel Felder wie möglich zu erraten ohne die Bombe zu treffen")
Infos2.place(x=330 , y=55)
Entschärft = tkinter.Label(root, textvariable = Right, font="Courier 16 bold")
Entschärft.place(x=480, y=85)
ent = tkinter.Label(root, text="Felder entschärft")
ent.place(x=440 , y=120)

root.mainloop()
Sirius3
User
Beiträge: 8796
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 5. März 2018, 07:09

@Tom12: wie __deets__ bereits geschrieben hat, ist eine if-Abfrage das richtige, Du brauchst keine while-Schleife. Man sollte nicht Anweisungen und Funktionsdefinitionen mischen, das führt dann dazu, dass man statt einer Funktion eine while-Schleife schreibt, obwohl der Kommentar etwas anderes behauptet. `int()` ist eine schlechte Variante um `0` zu schreiben, weil niemand das auf anhieb kapiert. Wenn Du schon ein IntVar `Right` hast, warum dann noch zusätzlich `richtig`? Variablen und Funktionen werden grundsätzlich klein geschrieben. `destr` ist eine unsinnige Abkürzung. Du sparst zwei Zeichen und handelst Dir dafür Unverständlichkeit ein.

Ganz abgesehen davon, dass die while-Schleife nie betreten wird, weil `richtig` zu diesem Zeitpunkt 0 ist, wann hättest Du erwartet, dass sie wieder verlassen wird, wenn sich `richtig` innerhalb der Schleife nie ändert?

Neun mal die gleiche Funktion zu schreiben, macht man nicht. Die Unterschiede löst man mit Parametern auf und bindet die Funktion über `partial` an die Buttons. `global` sollte man nicht benutzen, das führt nur zu unleserlichem Code. `place` sollte man nicht benutzen und vor allem hier nicht. Je nach System ist die Position des Buttons leicht unterschiedlich, so dass Dein Label nicht direkt darüber liegt. Außerdem ist es viel zu umständlich, von Hand alle Positionen zu ermitteln, dafür programmier man ja. Lokale Variablen sind unabhängig voneinander. Es gibt keinen Grund, warum man `w1` in jeder Funktion umbenennen sollte, zumal Du da auch welche vergessen hast und bei `Bild2` nicht das selbe gemacht hast. `w` oder `ww` sind ganz schlechte Variablennamen, weil sie nichts aussagen. `update` sollte man nicht verwenden, zumal es an dieser Stelle gar keinen Nutzen hat.

Wenn man 9 Knöpfe erzeugt, dann macht man das am besten über eine Schleife.
Tom12
User
Beiträge: 32
Registriert: Mittwoch 17. Januar 2018, 17:38

Dienstag 6. März 2018, 14:27

Sirius3 hat geschrieben:@Tom12: wie __deets__ bereits geschrieben hat, ist eine if-Abfrage das richtige, Du brauchst keine while-Schleife. Man sollte nicht Anweisungen und Funktionsdefinitionen mischen, das führt dann dazu, dass man statt einer Funktion eine while-Schleife schreibt, obwohl der Kommentar etwas anderes behauptet. `int()` ist eine schlechte Variante um `0` zu schreiben, weil niemand das auf anhieb kapiert. Wenn Du schon ein IntVar `Right` hast, warum dann noch zusätzlich `richtig`? Variablen und Funktionen werden grundsätzlich klein geschrieben. `destr` ist eine unsinnige Abkürzung. Du sparst zwei Zeichen und handelst Dir dafür Unverständlichkeit ein.

Neun mal die gleiche Funktion zu schreiben, macht man nicht. Die Unterschiede löst man mit Parametern auf und bindet die Funktion über `partial` an die Buttons. `global` sollte man nicht benutzen, das führt nur zu unleserlichem Code. `place` sollte man nicht benutzen und vor allem hier nicht. Je nach System ist die Position des Buttons leicht unterschiedlich, so dass Dein Label nicht direkt darüber liegt. Außerdem ist es viel zu umständlich, von Hand alle Positionen zu ermitteln, dafür programmier man ja. Lokale Variablen sind unabhängig voneinander. Es gibt keinen Grund, warum man `w1` in jeder Funktion umbenennen sollte, zumal Du da auch welche vergessen hast und bei `Bild2` nicht das selbe gemacht hast. `w` oder `ww` sind ganz schlechte Variablennamen, weil sie nichts aussagen. `update` sollte man nicht verwenden, zumal es an dieser Stelle gar keinen Nutzen hat.

Wenn man 9 Knöpfe erzeugt, dann macht man das am besten über eine Schleife.
Wo muss die if abfrage platziert sein? Jedesmal wenn ein button gedrückt wird? Muss es dann in den command der buttons? Und 'richtige' habe ich nur erstellt, da ich bei 'Right' einen Fehler bekommen habe
__deets__
User
Beiträge: 3998
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dienstag 6. März 2018, 14:41

Ja, die commands sind der einzige Ort, an dem du in einer GUI etwas an Code ausfuehren kannst. Oder in einem Timer-Ereignis. Aber Timer hast du ja nicht.
Tom12
User
Beiträge: 32
Registriert: Mittwoch 17. Januar 2018, 17:38

Dienstag 6. März 2018, 14:47

Aber dann müsste ich ja im if clause einen if clause einbauen und das ist nicht möglich oder ?
__deets__
User
Beiträge: 3998
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dienstag 6. März 2018, 14:52

Ich verstehe deine Frage nicht.

In ein if kannst du auch wieder ifs verschachteln.

Code: Alles auswählen

if a:
    tuwas()
    if b:
        tuwasanderes()
Und natuerlich kannst du auch mehrere if-Anweisungen nacheinander angeben:

Code: Alles auswählen

if a:
    ...
if b:
   ...
Achtung, das macht natuerlich jeweils etwas komplett anderes! Was fuer deinen Anwendungsfall das richtige ist, musst du entscheiden.
Tom12
User
Beiträge: 32
Registriert: Mittwoch 17. Januar 2018, 17:38

Dienstag 6. März 2018, 14:58

Ok danke wieder was neues gelernt :D


def Bomben1():
    global richtige
    if Bomb == 1:
        print("Game Over")
        Button1.config(state= tkinter.DISABLED)
        Bild2 = tkinter.PhotoImage(file="Bombe2.png")
        ww1 = tkinter.Label(root, image=Bild2)
        ww1.image = Bild2
        ww1.place(x=0, y=0)
        destr()
    else:
        print("Glück gehabt")
        Right.set(Right.get()+1)
        Button1.config(state= tkinter.DISABLED)
        root.update()
        Bild1 = tkinter.PhotoImage(file="wiese.png")
        w1 = tkinter.Label(root, image=Bild1)
        w1.image = Bild1
        w1.place(x=0, y=0)
        richtige = richtige + 1
        print(richtige)
If richtige == 8:
box = tkinter.infobox (...)
box.pack

Würde der if am ende funktionieren ?

Ps: falsch eingerückt worden
__deets__
User
Beiträge: 3998
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dienstag 6. März 2018, 15:02

Bitte benutz die code-tags. Und wie du schon selbst sagst: momentan falsch eingerueckt, und dem pack fehlen die Klammern zum Aufruf.
Sirius3
User
Beiträge: 8796
Registriert: Sonntag 21. Oktober 2012, 17:20

Dienstag 6. März 2018, 17:48

@__deets__: mit Code-Tags wär's richtig eingerückt.
Tom12 hat geschrieben:Und 'richtige' habe ich nur erstellt, da ich bei 'Right' einen Fehler bekommen habe
Dann wäre der richtige Weg, den Fehler zu korrigieren, statt weitere Variablen einzuführen.
Antworten