So, hier mal mein Code bis jetzt. Ich habe als Start jetzt mal so programmiert, dass beim Klick auf den entsprechenden Button einfach ein Bruch erzeugt und anschließend mit der entsprechenden Methode gekürzt wird.
HÄ? Selbstverständlich existiert dieses attribut, wie sich aus der Klasse unschwer ersehen lässt.
EDIT: Habe dafür den Fehler gefunden. Beim Objekterzeugen hat eine Klammer gefehlt.
Code: Alles auswählen
import tkinter
import random
import math
import time
import sys
def vorzeichenwahl():
return random.choice("+-*/")
def eingaberoutine(bruch):
ergebnis_zaehler = 0
ergebnis_nenner = 0
for i in range(1,4):
ergebnis_zaehler = int(zähler_eingabe.get())
ergebnis_nenner = int(nenner_eingabe.get())
if ergebnis_zaehler == bruch.zähler and ergebnis_nenner == bruch.nenner:
print ("richtig. Sie brauchten der Versuche ", i)
return i
elif (ergebnis_zaehler != bruch.zähler or ergebnis_nenner != bruch.nenner) and i == 3:
print ("Zu viele Versuche, nämlich ",i,)
return i
else:
print ("falsch")
def hole_zeit():
startzeit = int(round(time.time(),0))
zielzeit = startzeit +10
return startzeit,zielzeit
class Spiel:
def __init__(self):
#self.anzahl = anzahl
#self.typ = typ
self.korrekte_Aufgaben = 0
self.falsche_Aufgaben = 0
#self.name = input ("Dein Name?")
self.name = "Max Mustermann"
def speedrechnen(self,hs):
startzeit,zielzeit = hole_zeit()
z = 0
while startzeit < zielzeit:
#print (startzeit)
y=self.leichte_aufgabe(1)
startzeit = int(round(time.time(),0))
#time.sleep(1)
if y == True:
z+=1
print ("Startzeit: ",startzeit)
print ("Zielzeit: ",zielzeit)
print ("Sie haben innerhalb ", zielzeit - startzeit," ",z," Aufgaben gelöst")
hs.dateieintrag(self.name,z)
def leichte_aufgabe(self,anzahl):
for j in range(0, anzahl):
bruch = Bruch()
bruch.ausgabe()
bruch.kuerze_bruch()
bruch.ausgabe()
z = eingaberoutine(bruch)
print (z)
self.statistik(z,anzahl)
if (z == 1 and anzahl == 1) or j == anzahl:
return True
def schwere_aufgabe(self, anzahl):
for j in range(0,anzahl):
vorzeichen = vorzeichenwahl()
bruch1 = Bruch()
bruch2 = Bruch()
if vorzeichen == "+":
print (bruch1, " + ",bruch2)
ergebnis_zaehler,ergebnis_nenner=bruch1.addiere(bruch2)
elif vorzeichen == "-":
print (bruch1, " - ", bruch2)
ergebnis_zaehler,ergebnis_nenner=bruch1.subtrahiere(bruch2)
elif vorzeichen == "*":
print (bruch1, " * ", bruch2)
ergebnis_zaehler,ergebnis_nenner=bruch1.multipliziere(bruch2)
else:
print (bruch1, " / ", bruch2)
ergebnis_zaehler,ergebnis_nenner=bruch1.dividiere(bruch2)
bruch = Bruch(ergebnis_zaehler,ergebnis_nenner)
bruch.kuerze_bruch()
bruch.ausgabe()
z = eingaberoutine(bruch)
self.statistik(z, anzahl)
def statistik(self, z, anzahl):
if z == 1:
self.korrekte_Aufgaben += 1
elif z == 2:
self.falsche_Aufgaben += 1
else:
self.falsche_Aufgaben += 1
if self.korrekte_Aufgaben + self.falsche_Aufgaben == anzahl:
quote = round(self.korrekte_Aufgaben/anzahl*100,2)
print ("Sie haben ", self.korrekte_Aufgaben, " von ", anzahl, " Aufgaben richtig geloest, also ", quote, " %")
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 mache_nennergleich(self,other):
self.kuerze_bruch()
other.kuerze_bruch()
print (self)
print (other)
counter=1
counter_b=1
while self.nenner != other.nenner:
if self.nenner < other.nenner:
self.nenner += (self.nenner / counter)
#print ("Nenner_a ", self.nenner)
counter +=1
if other.nenner < self.nenner:
other.nenner += (other.nenner / counter_b)
#print ("Nenner_b ", other.nenner)
counter_b +=1
if self.nenner == other.nenner:
break
self.zähler *= counter
other.zähler *= counter_b
self.nenner = int(self.nenner)
other.nenner = int(other.nenner)
return self, other
def addiere(self,other):
if self.nenner != other.nenner:
self,other=self.mache_nennergleich(other)
ergebnis = self.zähler + other.zähler
nenner = self.nenner
return ergebnis,nenner
def subtrahiere(self, other):
if self.nenner != other.nenner:
self, other = self.mache_nennergleich(other)
ergebnis = self.zähler -other.zähler
nenner = self.nenner
return ergebnis,nenner
def multipliziere(self, other):
self.kuerze_bruch()
other.kuerze_bruch()
erg_z = self.zähler*other.zähler
erg_n = self.nenner*other.nenner
return erg_z, erg_n
def dividiere(self,other):
self.kuerze_bruch()
other.kuerze_bruch()
erg_z = self.zähler*other.nenner
erg_n = self.nenner*other.zähler
return erg_z, erg_n
def ausgabe(self):
print (self.zähler, " / ", self.nenner)
class Highscore():
#def __init__(self):
def dateieintrag(self, name, z):
lt = time.localtime()
try:
datei = open("rekorde.txt","a")
except:
print ("Konnte Datei nicht oeffnen")
datei.write(name+" hat am " +time.strftime("%d.%m.%Y",lt) + " "+str(z)+" Aufgaben richtig" + "\n")
datei.close()
try:
datei2 = open("daten.csv","a")
except:
print ("Konnte Datei nicht oeffnen")
datei2.write(name + ";" + str(z) + "\n")
datei2.close()
def lesen(self):
try:
datei = open("rekorde.txt")
except:
print ("Dateizugriff nicht erfolgreich")
allezeilen = datei.readlines()
datei.close()
such = " "
print (f"{'Name':>11}{'Aufgaben':>30}")
for zeile in allezeilen:
anzahl = zeile.count(such)
pos = zeile.find(such)
anfpos = pos
#print (anzahl, " ", pos)
for i in range(1,5):
#print (zeile)
pos = zeile.find(such, pos+1)
#print (pos)
#print (zeile[0:anfpos], " ",zeile[pos-1], " Aufgaben")
name = zeile[0:anfpos]
zahl = zeile[pos-1]
print (f"{zeile[0:anfpos]:>10}{int(zeile[pos-1]):20.0f}")
try:
datei2 = open("daten.csv")
except:
print ("Dateizugriff nicht erfolgreich")
gesamt = datei2.read()
datei2.close()
zeilen=gesamt.split(chr(10))
li = []
for zeile in zeilen:
zwliste = zeile.split(";")
print (zwliste)
li.append(zwliste)
print (li)
li2 = []
for s in range(0,len(li)):
sort = sorted(li[s])
li2.append(sort)
print (li2)
li = sorted(li2)
print (li)
for p in range(len(li)-1,0,-1):
print(f"{li[p][1]:<20}{int(li[p][0]):>2}")
def main():
def typ1():
#spiel = Spiel()
#spiel.leichte_aufgabe(3)
bruch = Bruch()
bruch.kuerze_bruch()
zähler_anzeige["text"] = str(bruch.zähler)
nenner_anzeige["text"] = str(bruch.nenner)
def typ2():
pass
def speedrechnen():
pass
def siehe_highscore():
pass
def ende():
haupt.destroy()
haupt = tkinter.Tk()
framelinks = tkinter.Frame(haupt, width=50)
#framelinks["bg"] = "#FF0000"
framelinks.pack(side="left", pady=0)
zähler_anzeige = tkinter.Label(framelinks, text = "3")
zähler_anzeige["width"] = 2
zähler_anzeige["height"] = 0
zähler_anzeige["font"] = "Arial 70 bold"
zähler_anzeige["bg"] = "cyan"
zähler_anzeige["anchor"] = "s"
zähler_anzeige.pack(pady = 30)
bruchstrich = tkinter.Label(framelinks, text = "_____")
bruchstrich["width"] = 0
bruchstrich["height"] = 0
bruchstrich["font"] = "Arial 40 bold"
#bruchstrich["anchor"] = "n"
bruchstrich.pack(pady = 0)
nenner_anzeige = tkinter.Label(framelinks, text = "4")
nenner_anzeige["width"] = 2
nenner_anzeige["bg"] = "cyan"
nenner_anzeige["height"] = 0
nenner_anzeige["font"] = "Arial 70 bold"
nenner_anzeige.pack(pady = 50)
framemitte = tkinter.Frame(haupt, width=50)
#framemitte["bg"] = "red"
framemitte.pack(side="left",pady=0)
istgleich = tkinter.Label(framemitte, text = "=")
istgleich["font"] = "Arial 70 bold"
istgleich["height"] = 0
istgleich["bg"] = "white"
istgleich["anchor"] = "n"
istgleich.pack(padx = 20)
framebuttons = tkinter.Frame(haupt, width=50)
framebuttons.pack(side="right",pady=0)
buttonende = tkinter.Button(framebuttons, text = "Ende", command = ende)
buttonende.pack(pady=0)
buttonaufgabe1 = tkinter.Button(framebuttons, text =" Kuerzen", command = typ1)
buttonaufgabe1.pack(pady=0,side="left")
buttonaufgabe2 = tkinter.Button(framebuttons, text = "Bruchrechnen", command = typ2)
buttonaufgabe2.pack()
buttonspeed = tkinter.Button(framebuttons, text = "Speedrechnen", command = speedrechnen)
buttonspeed.pack()
buttonhighscore = tkinter.Button(framebuttons, text = "Highscore ansehen", command = siehe_highscore)
buttonhighscore.pack()
framerechts = tkinter.Frame(haupt,width=500)
framerechts.pack(side="left",pady=2)
zähler_eingabe = tkinter.Entry(framerechts)
zähler_eingabe["bg"] = "white"
zähler_eingabe["font"] = "Arial 70 bold"
zähler_eingabe["width"] = 2
#zehler_eingabe["anchor"] = "center"
zähler_eingabe.pack(padx = 20,pady = 0)
bruchstrich2 = tkinter.Label(framerechts, text = "_____")
bruchstrich2["width"] = 0
bruchstrich2["height"] = 0
bruchstrich2["font"] = "Arial 40 bold"
#bruchstrich["anchor"] = "n"
bruchstrich2.pack(pady = 30)
nenner_eingabe = tkinter.Entry(framerechts)
nenner_eingabe["bg"] = "white"
nenner_eingabe["font"] = "Arial 70 bold"
nenner_eingabe["width"] = 2
#nenner_eingabe["anchor"] = "center"
nenner_eingabe.pack(padx = 20,pady = 20)
ausgabelabel = tkinter.Label(haupt, text = "ausgabe")
ausgabelabel.pack()
print ("Hauptprogramm")
hs = Highscore()
#anzahl = int(input ("Wieviel Aufgaben?"))
#typ = int(input ("Aufgabentyp?"))
spiel = Spiel()
haupt.mainloop()
#if typ == 1:
#spiel.leichte_aufgabe(anzahl)
#elif typ == 2:
#spiel.schwere_aufgabe(anzahl)
#elif typ == 3:
#hs = Highscore()
#spiel.speedrechnen(hs)
#hs.lesen()
if __name__ == '__main__':
main()
#s = Spiel(5,1)
Soweit, sogut.
Nun habe ich eine OK-Button erstellt und möchte, dass beim Klick darauf die Ergebniskontrollroutine kommt. Aber das funktioniert nicht, weil das Objekt "bruch" nicht erkannt wird. Müsste ich daher die Variable "bruch" global setzen?