Hallo,
ich habe jetzt mal versucht, das Programm ein wenig GUI-freundlicher zu gestalten. Das Problem, das ich habe, ist nun, dass Datentypen (in meinem Fall Objekte der Klasse Bruch) sich von einer Funktion nicht in die andere übertragen lassen.
Ich hätte 2 Lösungsansätze, weiß aber nicht, ob die gut sind:
1.) In der init-Methode der Spiel-Klasse wird automatisch ein Bruch erzeugt, in dem dann auch das Ergebnis gespeichert wird.
2.) Ich lese die Ausgabe in den labels aus, erstelle daraus einen neuen Bruch und nehme diesen dann als Grundlage zur Ergebnisüberprüfung.
Ich nehme an, da gibts sicherlich bessere Möglichkeiten. Hier mal der Code bis hierher:
Code: Alles auswählen
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.typ1)
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()
# Anzeige des Hauptfensters
self.hauptfenster.mainloop()
def typ1(self):
bruch = Bruch()
self.zähler_anzeige["text"] = str(bruch.zähler)
self.nenner_anzeige["text"] = str(bruch.nenner)
bruch.kuerze_bruch()
print (bruch)
def typ2(self):
pass
def speedrechnen(self):
pass
def siehe_highscore(self):
pass
def ende(self):
self.hauptfenster.destroy()
def ergebnisroutine(self,bruch):
print (bruch)
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)
#Hauptprogramm
#if __name__ == '__main':
spiel = Spiel()