Announcement

Collapse
No announcement yet.

Tkinter - Verknüpfung von toplevel-Fenstern mit Hauptfenster funktioniert nicht.

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Tkinter - Verknüpfung von toplevel-Fenstern mit Hauptfenster funktioniert nicht.

    Hallo,

    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()



  • Markus Lahr
    replied
    Anfänger und GUI-Programmierung ist nicht immer die beste Kombination... Eventuell hilft das für den Anfang: http://openbook.rheinwerk-verlag.de/...004.html#u19.4 (sowie Kap. 39) Und für später kann die Angabe der verwendeten Python Version ganz hilfreich sein.

    Leave a comment:

Working...
X