Welcher Fehler liegt hier vor? (Schere, Stein, Papier

Fragen zu Tkinter.
Antworten
TheSuspect
User
Beiträge: 2
Registriert: Donnerstag 17. August 2017, 19:17

Hallo Leute,

Ich bin dabei meine ersten Programme in Python zu schreiben und lerne langsam aber stetig. Nun bin ich dabei das erste Spiel mit einer GUi zu versehen, jedoch öffnet sich das Spiel nicht und es wird auch kein Fehler angezeigt. Würde mich freuen wenn Ihr mir sagen könnten was vorliegt.

Code: Alles auswählen

import sys
import random
import time
import tkinter

hfenster = tkinter.Tk()

#Überschrift
u1 = tkinter.Label(hfenster,text="\n***********************************")
u2 = tkinter.Label(hfenster,text="*     Schere | Stein | Papier     *")
u3 = tkinter.Label(hfenster,text="***********************************\n")
u1.pack()
u2.pack()
u3.pack()

#Variablen
figuren = ("Schere", "Stein", "Papier")
spielen = True

#Funktionen
def handleButtonSchere(event):
	spielerauswahl = 1
	tfeld["text"] = "Du hast Schere gewaehlt."
def handleButtonStein(event):
	spielerauswahl = 2
	tfeld["text"] = "Du hast Stein gewaehlt."
	
def handleButtonPapier(event):
	spielerauswahl = 3
	tfeld["text"] = "Du hast Papier gewaehlt."
	
def handleButtonJa(event):
	entscheidung = 1
	
def handleButtonNein(event):
	entscheidung = 2
	
#Programm
while spielen:
	
	tfeld = tkinter.Label(hfenster,text="Waehle eine Figur!")
	
	#Spielerfigur auswaehlen
	spielerauswahl = 0
	
	while spielerauswahl not in (1,2,3):
		buttonSchere = tkinter.Button(hfenster,text="Schere")
		buttonSchere.pack()
		buttonSchere.bind("<Button-1>", handleButtonSchere)
		buttonStein = tkinter.Button(hfenster,text="Stein")
		buttonStein.pack()
		buttonStein.bind("<Button-1>", handleButtonStein)
		buttonPapier = tkinter.Button(hfenster,text="Papier")
		buttonPapier.pack()
		buttonPapier.bind("<Button-1>", handleButtonPapier)
		
	spielerfigur = figuren[spielerauswahl - 1]
	
	#Warteschleife1
	time.sleep(1)
	tfeld["text"] = "Warte auf Computer..."
	time.sleep(1.5)
	tfeld["text"] = "  ...Computer hat gewaehlt!"
	time.sleep(1)
	
	#Computerfigur auswaehlen
	computerfigur = figuren[random.randint(0,2)]
	
	#Sieger ermitteln
	if spielerfigur == computerfigur:
		tfeld["text"] = "Unentschieden! Computer waehlte", computerfigur
	else:
		if spielerfigur == "Schere":
			if computerfigur == "Stein":
				tfeld["text"] = "Verloren! Computer waehlte", computerfigur
			else:
				tfeld["text"] = "Gewonnen! Computer waehlte", computerfigur
				
		if spielerfigur == "Stein":
			if computerfigur == "Schere":
				tfeld["text"] = "Gewonnen! Computer waehlte", computerfigur
			else:
				tfeld["text"] = "Verloren! Computer waehlte", computerfigur
			
		if spielerfigur == "Papier":
			if computerfigur == "Stein":
				tfeld["text"] = "Gewonnen! Computer waehlte", computerfigur
			else:
				tfeld["text"] = "Verloren! Computer waehlte", computerfigur
				
	#Wiederholung
	time.sleep(2)
	entscheidung = 0
	
	while entscheidung not in (1,2):
		nfenster = tkinter.Tk()
		
		tfeldn = tkinter.Label(nfenster,text="Nochmal spielen?")
		
		buttonJa = tkinter.Button(nfenster,text="Ja")
		buttonJa.pack()
		buttonJa.bind("<Button-1>", handleButtonJa)
		buttonNein = tkinter.Button(nfenster,text="Nein")
		buttonNein.pack()
		buttonNein.bind("<Button-1>", handleButtonNein)
		
		if entscheidung == 2:
			spielen = False
		elif entscheidung == 1:
			spielen = True

hfenster.mainloop()
(Bitte nicht über mein ineffiziente Programmierweise wundern, ich bin erst 5 Vollzeitstunden beim programmierenlernen)

Liebe Grüße Flo :)
Zuletzt geändert von Anonymous am Donnerstag 17. August 2017, 20:12, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@TheSuspect: Du versuchst einen seriellen Programmablauf mit ereignisgesteuerter GUI zu kombinieren. Das funktioniert so nicht. Fang erst einmal an objektorientierte Programmierung zu lernen. Wenn Du die richtig verstanden hast, kannst Du zu GUI-Programmierung weitergehen, wobei Du aber komplett umdenken mußt. Nach ein paar einfachen Beispielen, die es überall gibt, kannst Du zu Deinem Spiel zurückkehren.

Was Du sofort umsetzen kannst: Eingerückt wird mit 4 Leerzeichen pro Ebene, nicht 3.
TheSuspect
User
Beiträge: 2
Registriert: Donnerstag 17. August 2017, 19:17

@Sirius3:

Vielen Dank für deine schnelle Antwort!

Okay, dann werde ich erstmal wieder ein paar Gänge zurückschalten und eins nach dem anderen lernen.
(Obwohl es mir schwer fällt, da es so viel Spaß macht einfach mal irgendetwas zu testen :D )
Die Einrückung habe ich bei Notepad++ mit Tab gemacht, muss ich dann da wohl irgendwo umstellen.

Liebe Grüße Flo
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@TheSuspect: also sleep hat in einer GUI Anwendung überhaupt nichts verloren. Du machst ein sleep und wartest, bis der Computer etwas gemacht hat. Aber der macht inzwischen gar nichts, denn mit sleep hast Du ihn schlafen gelegt. Und mit einer Schleife macht er auch gar nichts, denn da ist Deine Schleife dran und während die läuft, kann tkinter auch gar nichts machen.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

TheSuspect hat geschrieben:Die Einrückung habe ich bei Notepad++ mit Tab gemacht, muss ich dann da wohl irgendwo umstellen.
Menüpfad: Einstellungen -> Sprachmenü/Tabs -> Tabulatorbreite: 4 und Häkchen bei durch Leerzeichen ersetzen.
Antworten