Die Schlatfläche erstellt sich nicht bevor das Programm ausgeführt wird

Fragen zu Tkinter.
Antworten
gesundheitsmann
User
Beiträge: 2
Registriert: Mittwoch 7. August 2019, 00:57

Mittwoch 7. August 2019, 15:26

Hallo liebe Community,

ich habe folgendes Problem in Python drei auf Linux:

Ich bin noch ein Blutiger Anfänger. Deswegen habe ich mir zuerst ein kleines Konsolenspiel programmiert. Dieses wollte ich jetzt Stück für Stück verbessern(Updaten). Leider stoße ich nun schon bei der zweiten Version auf ein Problem mit Tkinter. Ich will eine Schaltfläche für die Eingabe Programmieren, dass der User nur einen Klick machen muss und keine Zahl in die Konsole eingeben. Das Problem ist das sich diese Schaltfläche erst am Ende(Also beim Game-Over) öffnet. Ich finde jedoch keinen Lösungsansatz. Wundert euch bitte nicht wenn es noch keine Funktionen für die Button gibt. Das spiel ist nur ganz grob erstellt da ich mir keinen Aufwand machen wollte bevor ich diesen Fehler nicht behoben habe.
Meine Vermutung war zuerst das ich die Buttons in die While-Schleife machen muss, das hatt aber auch nicht funktioniert(weder so noch mit einer If-bedingung). Deswegen habe ich sie jetzt einfach oben Abgelegt.
P.s. Ich habe auch schon gelesen das man nur Module importieren soll. Leider wurde ich aus den Informationen zu den Modulen hier nicht schlau, da diese Angaben bei mir nicht funktioniert haben.
Hier ist das Spiel, ich weiß nicht was wichtig ist deswegen hier das ganze Programm.

Code: Alles auswählen

#GesiterspielV1.1
from random import randint
from tkinter import*
score = 0
window = Tk()
button1 = Button(window, text='1')
button2 = Button(window, text='2')
button3 = Button(window, text='3')
button1.pack()
button2.pack()
button3.pack()
du_bist_mutig = True
while du_bist_mutig:
    geistertuer = randint(1, 3)
    print('Wilkommen im Geisterhaus')
    tuer = input('1, 2 o.3?')
    tuer_nummer = int(tuer)
    if tuer_nummer == geistertuer:
        print('Tot')
        du_bist_mutig = False
    else:
        print('Kein Geist, gehe eine Tür weiter')
        score = score + 1
print('Deine Mutter holt einen Sarg')
print('Deine Punkte', score)
Mit freundlichen Grüßen
gesundheitsmann
__deets__
User
Beiträge: 6848
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mittwoch 7. August 2019, 15:49

Eine GUI zu programmieren ist fundamental anders als ein solcher linearer Programmablauf. while-Schleifen und GUIs vertragen sich prinzipbedingt nicht, denn GUIs haben eine eigene Ereignisschleife, und dann nur Events, auf die man reagieren muss. Bau dir eine GUI, die einfach nur die drei Buttons hat, und lerne, wie man an einen Button ein command uebergibt, dass dann ausgefuehrt wird, wenn der Button gedrueckt wird. Darin pruefst du dann deine gewuenschte Bedingung.
gesundheitsmann
User
Beiträge: 2
Registriert: Mittwoch 7. August 2019, 00:57

Mittwoch 7. August 2019, 15:55

Danke erstmal für die schnelle Antwort deets,
ich habe schon gelernt wie man Buttons mit befehlen Programmiert. Wenn ich das richtig verstanden habe soll ich jetzt also das Hauptprogramm(also das Speil) um die GUI herum bauen und die Funktionen dann in die Buttons Verwursteln. Dann könnte man ja auch rein Theoretisch einen Button zu Auswertung der Eingabe bauen und bräuchte garkeine eigenen Schleifen mehr.
Ich bedanke mich nochmal für die Hilfe. Wenn ich trozdem etwas falsch verstanden habe wäre ich über eine zweite Antwort trozdem dankbar^^
__deets__
User
Beiträge: 6848
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mittwoch 7. August 2019, 15:58

Du brauchst nicht nur keine Schleife, du kannst keine Schleife. Ich weiss nicht was passieren soll wenn der Benutzer verliert (Messagebox oder was auch immer), aber du brauchst fuer dieses simple Spiel nur eine einzige Action, die du an alle 3 Buttons uebergibst. Und darin wuerfelst du (mit random.randint(1, 3) zB), und wenn der Wert 1 ist hat der Spieler halt verloren.
Benutzeravatar
__blackjack__
User
Beiträge: 4663
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Dienstag 13. August 2019, 20:42

Mal als Code umgesetzt:

Code: Alles auswählen

#!/usr/bin/env python3
from functools import partial
from random import randrange
import tkinter as tk
from tkinter import messagebox

DOOR_COUNT = 3


def open_door(root, score):
    if randrange(DOOR_COUNT) == 0:
        messagebox.showerror(
            'Tot', f'Deine Mutter holt einen Sarg.\nDeine Punkte: {score.get()}'
        )
        root.quit()
    else:
        score.set(score.get() + 1)
        messagebox.showinfo('Kein Geist', 'Kein Geist, gehe eine Tür weiter.')


def main():
    root = tk.Tk()
    score = tk.IntVar()
    for i in range(1, DOOR_COUNT + 1):
        tk.Button(
            root, text=f'Tür {i}', command=partial(open_door, root, score)
        ).pack()
    root.mainloop()


if __name__ == '__main__':
    main()
“Give a man a fire and he's warm for a day, but set fire to him and he's warm for the rest of his life.”
— Terry Pratchett, Jingo
Antworten