ich bin noch absoluter Anfänger in Python. Ich bin gerade dabei zur Übung ein Programm zu Entwicklung, in welchem der Nutzer Brüche vollständig gekürzt angeben muss. Dazu habe ich auch eine GUI entworfen. Als nächsten Schritt wollte ich beim Spielstart sozusagen (Klick auf den Button "Kuerzen"), dass ein Toplevel Fenster aufgeht, in dem der Spieler einen Namen einträgt. Der Text dieses Entry-Feldes soll dann in anderen Funktion weiterverwendet werden. Leider gelingt es mir nicht, es so zu machen, dass der Inhalt des Entries woanders verfügbar ist. Wenn ich die Variable zuvor global setze, erhalte ich einen None-Typ und wenn ich das nicht tue, dann findet er es nicht und sagt "name is not defined".
Was könnte ich da machen?
Anbei mal der Code (man müsste vielleicht noch erwähnen, dass das Ganze objektorientiert abläuft, also das Programm an sich ist in der Klasse "Spiel":
Für eine Antwort wäre ich sehr dankbar. Falls man den Code irgendwie besonders markieren soll, tut es mir leid. Ich habe nichts gefunden, womit man das machen könnte.
Beste Grüße und vielen Dank.
import tkinter
import random
import sys
import os
import math
class Spiel:
#Spiel spielen
def __init__(self):
# das Hauptfenster
self.hauptfenster = tkinter.Tk()
# definiere Darstellung des zu kürzenden Bruches
self.framelinks = tkinter.Frame(self.hauptfenster, width = 50)
self.framelinks.pack(side = "left", pady = 0)
self.zähler_anzeige = tkinter.Label(self.framelinks, text = "3")
self.zähler_anzeige["width"] = 2
self.zähler_anzeige["height"] = 0
self.zähler_anzeige["font"] = "Arial 70 bold"
self.zähler_anzeige["bg"] = "cyan"
self.zähler_anzeige["anchor"] = "s"
self.zähler_anzeige.pack(pady = 30)
self.bruchstrich = tkinter.Label(self.framelinks, text = "_____")
self.bruchstrich["width"] = 0
self.bruchstrich["height"] = 0
self.bruchstrich["font"] = "Arial 40 bold"
#bruchstrich["anchor"] = "n"
self.bruchstrich.pack(pady = 0)
self.nenner_anzeige = tkinter.Label(self.framelinks, text = "4")
self.nenner_anzeige["width"] = 2
self.nenner_anzeige["bg"] = "cyan"
self.nenner_anzeige["height"] = 0
self.nenner_anzeige["font"] = "Arial 70 bold"
self.nenner_anzeige.pack(pady = 50)
self.framemitte = tkinter.Frame(self.hauptfenster, width=50)
#framemitte["bg"] = "red"
self.framemitte.pack(side="left",pady=0)
self.istgleich = tkinter.Label(self.framemitte, text = "=")
self.istgleich["font"] = "Arial 70 bold"
self.istgleich["height"] = 0
self.istgleich["bg"] = "white"
self.istgleich["anchor"] = "n"
self.istgleich.pack(padx = 20)
self.framerechts = tkinter.Frame(self.hauptfenster,width=500)
self.framerechts.pack(side="left",pady=2)
# Definition Ergebniseingabe
self.zähler_eingabe = tkinter.Entry(self.framerechts)
self.zähler_eingabe["bg"] = "white"
self.zähler_eingabe["font"] = "Arial 70 bold"
self.zähler_eingabe["width"] = 2
#zehler_eingabe["anchor"] = "center"
self.zähler_eingabe.pack(padx = 20,pady = 0)
self.bruchstrich2 = tkinter.Label(self.framerechts, text = "_____")
self.bruchstrich2["width"] = 0
self.bruchstrich2["height"] = 0
self.bruchstrich2["font"] = "Arial 40 bold"
#bruchstrich["anchor"] = "n"
self.bruchstrich2.pack(pady = 30)
self.nenner_eingabe = tkinter.Entry(self.framerechts)
self.nenner_eingabe["bg"] = "white"
self.nenner_eingabe["font"] = "Arial 70 bold"
self.nenner_eingabe["width"] = 2
#nenner_eingabe["anchor"] = "center"
self.nenner_eingabe.pack(padx = 20,pady = 20)
# Definition Buttons
self.framebuttons = tkinter.Frame(self.hauptfenster, width=50)
self.framebuttons.pack(side="right",pady=0)
self.buttonende = tkinter.Button(self.framebuttons, text = "Ende", command = self.ende)
self.buttonende.pack(pady=0)
self.buttonaufgabe1 = tkinter.Button(self.framebuttons, text =" Kuerzen", command = self.namensfenster)
self.buttonaufgabe1.pack(pady=0,side="left")
self.buttonaufgabe2 = tkinter.Button(self.framebuttons, text = "Bruchrechnen", command = self.typ2)
self.buttonaufgabe2.pack()
self.buttonspeed = tkinter.Button(self.framebuttons, text = "Speedrechnen", command = self.speedrechnen)
self.buttonspeed.pack()
self.buttonhighscore = tkinter.Button(self.framebuttons, text = "Highscore ansehen", command = self.siehe_highscore)
self.buttonhighscore.pack()
self.buttonok = tkinter.Button(self.framebuttons, text = "OK", command = self.ergebnisroutine)
self.buttonok.pack()
# Ausgabelabel
self.infoausgabe = tkinter.Label(self.hauptfenster, text = " ", bg = "yellow", width = 50)
self.infoausgabe.pack()
self.anzahl = 3
self.aufgabenzähler = 0
self.z = 0
def namensfenster(self):
global neu
neu = tkinter.Toplevel(self.hauptfenster)
tkinter.Button(neu, text = "Bestätigen", command = self.bestätigen).pack()
global self.enname
self.enname = tkinter.Entry (neu).pack()
def bestätigen(self):
self.infoausgabe["text"] = self.enname.get()
neu.destroy()
self.aufgabenzähler = 0
self.typ1()
def typ1(self):
if self.aufgabenzähler ==3:
print (" Aufgaben erledigt ")
#self.aufgabenzähler = 0
# return
else:
print (self.aufgabenzähler)
self.bruch = Bruch()
self.zähler_anzeige["text"] = str(self.bruch.zähler)
self.nenner_anzeige["text"] = str(self.bruch.nenner)
self.bruch.kuerze_bruch()
print (self.bruch)
def ende(self):
self.hauptfenster.destroy()
def kuerzen(self):
self.namensfenster()
self.aufgabenzähler = 0
self.typ1()
def ergebnisroutine(self):
if self.aufgabenzähler ==3:
print ("jetzt soll nix mehr kommen")
else:
ergebnis_zähler = 0
ergebnis_nenner = 0
try:
ergebnis_zähler = int(self.zähler_eingabe.get())
ergebnis_nenner = int(self.nenner_eingabe.get())
#print (ergebnis_zähler)
except:
self.infoausgabe["text"] = "Bitte Zahl eingeben"
#self.infoausgabe["text"] = str(ergebnis_zähler)
else:
self.infoausgabe["text"] = str(ergebnis_zähler)
if ergebnis_zähler == self.bruch.zähler and ergebnis_nenner == self.bruch.nenner:
self.infoausgabe["text"] = "richtig"
self.aufgabenzähler +=1
self.typ1()
elif (ergebnis_zähler != self.bruch.zähler or ergebnis_nenner != self.bruch.nenner) and self.z ==3:
self.infoausgabe["text"] = "Zu viele Versuche"
self.z = 0
self.aufgabenzähler += 1
self.typ1()
else:
self.infoausgabe["text"] = "falsch"
self.z +=1
print (self.z)
self.zähler_eingabe.delete(0)
#if self.aufgabenzähler < 3:
#self.infoausgabe["text"] = "Alle Aufgaben gelöst"
#else:
#self.typ1()
class Bruch:
def __init__(self,zähler=0,nenner=0):
self.zähler=zähler
self.nenner=nenner
if zähler==0 or nenner ==0:
wert_zähler = self.generiere_bruchzahl()
wert_nenner = self.generiere_bruchzahl()
self.zähler += wert_zähler
self.nenner += wert_nenner
prob = 2,2,2,2,3,3,3,5,5,7
def __str__(self):
return str(self.zähler) + "/" + str(self.nenner)
def generiere_bruchzahl(self):
prob = 2,2,2,2,3,3,3,5,5,7
wert = 1
#random.choice(prob)
random.seed()
anz = random.randint(2,5)
for i in range(1,anz):
wert *=random.choice(prob)
#print (wert)
return wert
def kuerze_bruch(self):
ggt = math.gcd(self.zähler,self.nenner)
self.zähler = self.zähler // ggt
self.nenner = self.nenner // ggt
self.zähler = int(self.zähler)
self.nenner = int(self.nenner)
def main():
spiel = Spiel()
spiel.hauptfenster.mainloop()
#Hauptprogramm
if __name__ == '__main__':
main()
Comment