in Klassen umschreiben...

Fragen zu Tkinter.
Antworten
Tux
User
Beiträge: 70
Registriert: Freitag 8. November 2002, 23:07
Kontaktdaten:

Freitag 21. November 2003, 23:09

Hi @ll,

wenn jemand von mal nix zu tun hat, würd ich mich freuen, wenn das mal jemand so umschreiben kann, dass es nur noch Klassen sind. Die Klassen sollen Vererbung enthalten und es sollen auch mehrere Funktionen in einer Klasse sein!

zusammen sein sollten:
renovieren, renovierenb,einziehen,ausziehen - in einer Klasse
eabreissen,abreissen,grundriss - in einer anderen Klasse

Die __init__ (wenn notwendig) sollte in der 2.-genannten Klasse sein.
die bereits vorhandene Klasse kann entweder so bleiben, oder ihr baut sie halt um -- hauptsache es funktioniert (und ich versteh am Ende noch irgendwas)

Code: Alles auswählen

import Tkinter
from Tkconstants import *
import tkSimpleDialog2
import tkMessageBox

tk=Tkinter.Tk()
f1=Tkinter.Frame(tk)
f1.pack(side="left")
f2=Tkinter.Frame(tk)
f2.pack(side="top")

l1=Tkinter.Label(f2,text="Sie haben eine leere Flaeche - errichten sie einen Grundriss")
l1.grid(row=0,column=0)

anzahl=0.0
farbe=[]
var=Tkinter.StringVar()
fragenachok=0

class modalerDialog(tkSimpleDialog2.Dialog):
    def body(self,master):
        self.title("Stockwerk aussuchen")
        Tkinter.Label(master,text="Bitte Stockwerk eingeben")
        e1=Tkinter.Entry(master,textvariable=var).pack()
        var.set("0")
    def ok(self, event=None):
        global fragenachok
        fragenachok=1
        if not self.validate():
            self.initial_focus.focus_set() 
            return

        self.withdraw()
        self.update_idletasks()
        self.apply()
        self.cancel()

def renovierenb():
    global farbe
    global anzahl
    global fragenachok
    modalerDialog(f1)
    if fragenachok==1:
        fragenachok=0
        try:
            if farbe[len(farbe)-int(var.get())-1]==2:
                farbe[(len(farbe)-int(var.get())-1)]=0
                l1['text']="Renovierung wurde beendet"
                b4=Tkinter.Button(f1,text="Haus abreissen",command=abreissen).grid(row=4,column=0,sticky="news")
                a=400.0/anzahl
                for b in xrange(int(anzahl)):
                    c="c"+str(b)
                    c=canvas.create_rectangle(390,(a*b),10,a*(b+1))
                    canvas.itemconfig(c,fill="green")
                    if farbe[b]==1:
                        canvas.itemconfig(c,fill="red")
                    elif farbe[b]==2:
                        canvas.itemconfig(c,fill="blue")
                e=0
                for d in xrange(len(farbe)):
                    if farbe[d]==2:
                        e=1
                        break
                if e==0:
                    Tkinter.Label(f1).grid(row=9,column=0,sticky="news")
                b6=Tkinter.Button(f1,text="Leute einziehen lassen",command=einziehen).grid(row=6,column=0,sticky="news")
                b8=Tkinter.Button(f1,text="Renovieren",command=renovieren).grid(row=8,column=0,sticky="news")

            else:
                tkMessageBox.showerror("Fehler","Dort findet keine Renovierung statt")
        except:
            tkMessageBox.showerror("Fehler","Bitte Eingaben nachsehen")
            pass
        for i in xrange(len(farbe)):
            if farbe[i]!=0:
                l4=Tkinter.Label(f1).grid(row=4,column=0, sticky="news")
        if farbe[0]==0:
            b5=Tkinter.Button(f1,text="Oberste Etage abreissen",command=eabreissen).grid(row=5,column=0,sticky="news")

def renovieren():
    global farbe
    global anzahl
    global fragenachok
    modalerDialog(f1)
    if fragenachok==1:
        fragenachok=0
        try:
            if farbe[len(farbe)-int(var.get())-1]==0:
                farbe[(len(farbe)-int(var.get())-1)]=2
                l1['text']="Die angegebene Etage wird renoviert"
                b9=Tkinter.Button(f1,text="Renovierung abschliessen",command=renovierenb).grid(row=9,column=0,sticky="news")
                a=400.0/anzahl
                for b in xrange(int(anzahl)):
                    c="c"+str(b)
                    c=canvas.create_rectangle(390,(a*b),10,a*(b+1))
                    canvas.itemconfig(c,fill="green")
                    if farbe[b]==1:
                        canvas.itemconfig(c,fill="red")
                    elif farbe[b]==2:
                        canvas.itemconfig(c,fill="blue")
                e=0
                for d in xrange(len(farbe)):
                    e=1
                    break
                if e==0:
                    l2=Tkinter.Label(f1).grid(row=7,column=0,sticky="news")
            elif farbe[len(farbe)-int(var.get())-1]==2:
                tkMessageBox.showerror("Fehler","Dort wird bereits renoviert")
            else:
                tkMessageBox.showerror("Fehler","Dort wohnt schon jemand")
        except:
            tkMessageBox.showerror("Fehler","Bitte Eingaben nachsehen")
            pass
        o=0
        p=0
        for i in xrange(len(farbe)):
            if farbe[i]!=0:
                l4=Tkinter.Label(f1).grid(row=4,column=0, sticky="news")
            if farbe[i]==2:
                o=o+1
            if farbe[i]==1:
                p=p+1
        if o==int(anzahl):
            Tkinter.Label(f1).grid(row=7,column=0,sticky="news")
        if p==int(anzahl):
            Tkinter.Label(f1).grid(row=9,column=0,sticky="news")
        if (int(o)+int(p))==int(anzahl):
            Tkinter.Label(f1).grid(row=6,column=0,sticky="news")
            Tkinter.Label(f1).grid(row=8,column=0,sticky="news")
        if farbe[0]!=0:
            l5=Tkinter.Label(f1).grid(row=5,column=0,sticky="news")

def ausziehen():
    global farbe
    global anzahl
    global fragenachok
    modalerDialog(f1)
    if fragenachok==1:
        fragenachok=0
        try:
            if farbe[len(farbe)-int(var.get())-1]==1:
                farbe[(len(farbe)-int(var.get())-1)]=0
                l1['text']="Leut ist ausgezogen"
                a=400.0/anzahl
                for b in xrange(int(anzahl)):
                    c="c"+str(b)
                    c=canvas.create_rectangle(390,(a*b),10,a*(b+1))
                    canvas.itemconfig(c,fill="green")
                    if farbe[b]==1:
                        canvas.itemconfig(c,fill="red")
                    elif farbe[b]==2:
                        canvas.itemconfig(c,fill="blue")
                e=0
                for d in xrange(len(farbe)):
                    if farbe[d]!=0:
                        e=e+1
                if e==0:
                    l2=Tkinter.Label(f1).grid(row=7,column=0,sticky="news")
                    b4=Tkinter.Button(f1,text="Haus abreissen",command=abreissen).grid(row=4,column=0,sticky="news")
                if farbe[0]==0:
                    b5=Tkinter.Button(f1,text="Oberste Etage abreissen",command=eabreissen).grid(row=5,column=0,sticky="news")
                b6=Tkinter.Button(f1,text="Leute einziehen lassen",command=einziehen).grid(row=6,column=0,sticky="news")
                b8=Tkinter.Button(f1,text="Renovieren",command=renovieren).grid(row=8,column=0,sticky="news")
                
            else:
                tkMessageBox.showerror("Fehler","Dort wohnt niemand")
        except:
            tkMessageBox.showerror("Fehler","Bitte Eingaben nachsehen")
            pass
    
def einziehen():
    global fragenachok
    global anzahl
    global farbe
    modalerDialog(f1)
    if fragenachok==1:
        fragenachok=0
        if farbe[len(farbe)-int(var.get())-1]==1:
            tkMessageBox.showerror("Fehler","Dort wohnt bereits jemand")
        elif farbe[len(farbe)-int(var.get())-1]==2:
            tkMessageBox.showerror("Fehler","Dort wird gerade renoviert")
        else:
            try:
                if int(var.get())<anzahl:
                    farbe[(len(farbe)-1-int(var.get()))]=1
                    l1['text']="Leut ist eingezogen"
                    a=400.0/anzahl
                    for b in xrange(int(anzahl)):
                        c="c"+str(b)
                        c=canvas.create_rectangle(390,(a*b),10,a*(b+1))
                        canvas.itemconfig(c,fill="green")
                        if farbe[b]==1:
                            canvas.itemconfig(c,fill="red")
                        elif farbe[b]==2:
                            canvas.itemconfig(c,fill="blue")
                    if farbe[0]==1:
                        Tkinter.Label(f1).grid(row=5,column=0,sticky="news")
                    b7=Tkinter.Button(f1,text="Leut ausziehen lassen",command=ausziehen).grid(row=7,column=0,sticky="news")
                    Tkinter.Label(f1).grid(row=4,column=0,sticky="news")
                    o=0
                    for m in xrange(len(farbe)):
                        if farbe[m]==1 or farbe[m]==2:
                            o=o+1
                    if int(o)==int(anzahl):
                        Tkinter.Label(f1).grid(row=6,column=0,sticky="news")
                        Tkinter.Label(f1).grid(row=8,column=0,sticky="news")
                else:
                    tkMessageBox.showerror('Fehler','die Etage existiert nicht')
            except:
                tkMessageBox.showerror("Fehler","Bitte Eingaben nachsehen")
                pass

def eabreissen():
    global anzahl
    global farbe
    if farbe[0]==1:
        tkMessageBox.showerror("Fehler","Dort wohnt jemand")
    elif farbe[0]==2:
        tkMessageBox.showerror("Fehler","Dort wird gerade renoviert")
    else:
        anzahl=anzahl-1.0
        farbe=farbe[1: ]
        if farbe==[]:
            abreissen()
        else:
            if anzahl==0.0:
                abreissen()
            else:
                l1['text']="noch vorhandene Etagen:", anzahl
                a=400.0/anzahl
                for b in xrange(int(anzahl)):
                    c="c"+str(b)
                    c=canvas.create_rectangle(390,(a*b),10,a*(b+1))
                    canvas.itemconfig(c,fill="green")
                    if farbe[b]==1:
                        canvas.itemconfig(c,fill="red")
                    elif farbe[b]==2:
                        canvas.itemconfig(c,fill="blue")
    try:
        if farbe[0]!=0:
            Tkinter.Label(f1).grid(row=5,column=0,sticky="news")
        o=0
        p=0
        for i in xrange(len(farbe)):
            if farbe[i]==1:
               o=o+1
            elif farbe[i]==2:
                p=p+1
        if o==int(anzahl):
            Tkinter.Label(f1).grid(row=9,column=0,sticky="news")
        if p==int(anzahl):
            Tkinter.Label(f1).grid(row=7,column=0,sticky="news")
        if (p+o)==int(anzahl):
            Tkinter.Label(f1).grid(row=6,column=0,sticky="news")
            Tkinter.Label(f1).grid(row=8,column=0,sticky="news")
    except:
        pass

def abreissen():
    global farbe
    import os
    os.startfile(os.getcwd()+"/hochhaus.pyw")
    tk.destroy()

def etage():
    global anzahl
    global farbe
    b4=Tkinter.Button(f1,text="Haus abreissen",command=abreissen).grid(row=4,column=0,sticky="news")
    b5=Tkinter.Button(f1,text="Oberste Etage abreissen",command=eabreissen).grid(row=5,column=0,sticky="news")
    b6=Tkinter.Button(f1,text="Leute einziehen lassen",command=einziehen).grid(row=6,column=0,sticky="news")
    b8=Tkinter.Button(f1,text="Renovieren",command=renovieren).grid(row=8,column=0,sticky="news")
    for i in xrange(len(farbe)):
        if farbe[i]!=0:
            l4=Tkinter.Label(f1).grid(row=4,column=0, sticky="news")
    anzahl=anzahl+1.0
    farbe=[0]+farbe
    l1['text']="errichtete Etage:", anzahl-1
    a=400.0/anzahl
    for b in xrange(int(anzahl)):
        c="c"+str(b)
        c=canvas.create_rectangle(390,(a*b),10,a*(b+1))
        canvas.itemconfig(c,fill="green")
        if farbe[b]==1:
            canvas.itemconfig(c,fill="red")
        elif farbe[b]==2:
            canvas.itemconfig(c,fill="blue")
                    
def grundriss():
    linie=canvas.create_line(390,400,10,400)
    canvas.itemconfig(linie,fill="black")
    l1["text"]="Grundriss ist festgelegt"
    b3=Tkinter.Button(f1,text="Etage errichten",command=etage).grid(row=3,column=0,sticky="news")
    Tkinter.Label(f1).grid(row=2,column=0,sticky="news")

b2=Tkinter.Button(f1,text="Grundriss festlegen",command=grundriss).grid(row=2,column=0,sticky="news")
b1=Tkinter.Button(f1,text="Beenden",command=tk.destroy).grid(row=1,column=0,sticky="news")

canvas=Tkinter.Canvas(tk,width=400, height=400,bg="grey")
canvas.pack(side="right")

Tkinter.mainloop()


DANKE schon mal...
ICH
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Samstag 22. November 2003, 00:49

Für 45 Euro die Stunde bin ich dabei :lol:

Warum machst du es nichtselbst? Zeitmangel? Du willst nur sehen wie es geht?

Hans
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Samstag 22. November 2003, 10:09

Hallo!
Tux hat geschrieben:zusammen sein sollten:
renovieren, renovierenb,einziehen,ausziehen - in einer Klasse
eabreissen,abreissen,grundriss - in einer anderen Klasse
Ich vermute, Du willst eine Klasse Etage und eine Klasse Haus? Ob sich das für die Etage lohnt, weiß ich nicht. Eine Etage kennt ja gerade mal 3 Zustände.
Wichtiger wäre es, strikt Daten und Sicht zu trennen. Hier mal ein grober Entwurf, wie die Datenklasse aussehen könnte:

Code: Alles auswählen

# Etagen-Aktionen
EA_EINZIEHEN = 1
EA_AUSZIEHEN = 2
EA_BEGINN_RENOVIEREN = 3
EA_ENDE_RENOVIEREN = 4
# Etagen-Status
ES_FREI = 10
ES_BEWOHNT = 11
ES_RENOVIERUNG = 12

class Haus(object):
    def __init__(self):
        self._etagen = []  
        self._bGrundrissAngelegt = False

    def grundrissAnlegen(self):  _bGrundrissAngelegt = True
        
    def addEtage(self):  self._etagen.append(ES_FREI)

    def removeEtage(self):
        if len(self._etagen) > 0 and self._etagen[-1] == ES_FREI:
            self._etagen.pop()
 
    def etagenAktion(self,nEtage,aktion):
        status = self._etagen[nEtage]
        if aktion == EA_EINZIEHEN and status == ES_FREI:
            self._etagen[nEtage] = ES_BEWOHNT
        elif aktion == EA_AUSZIEHEN and status == ES_BEWOHNT:
            self._etagen[nEtage] = ES_FREI
        # usw.
        
    def getEtagenStatus(self,nEtage):  return self._etagen[nEtage]
        
    def getEtagenStatusListe(self):  return self._etagen
        

if __name__ == '__main__':
    h = Haus()
    h.grundrissAnlegen()
    h.addEtage()
    h.addEtage()
    if h.getEtagenStatus(1) == ES_FREI:  h.etagenAktion(1,EA_EINZIEHEN)
    else:                                pass # Fehlermeldung
    h.addEtage()
    h.removeEtage()
    print h.getEtagenStatusListe()
Das wäre das Modul, dass Du dann in Dein Tkinter-Script importieren könntest. Mit der Liste, die getEtagenStatusListe() zurückgibt, hast Du dann alle Infos, um das Haus zu zeichnen.
Nur mal so als Idee.
Jan
Tux
User
Beiträge: 70
Registriert: Freitag 8. November 2002, 23:07
Kontaktdaten:

Samstag 22. November 2003, 12:26

@hans: ich habe bisher einmal was mit Klassen zu tun gehabt und das war ne Abschreibübung im Unterricht... -- ich hab eigentlich keinen Plan von Klassen -- in dem Skript soll es aber nur mit Klassen gehen...

@voges: danke schon mal... Ich brauch aber die anderen 3 Sachen auch als Extraklasse -- soll so sein - wenns nach mir geht würd ich es so lassen, wie es war (aber es geht in diesem Fall nicht nach mir) ...
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Samstag 22. November 2003, 12:55

Hi Tux,

also wenn Du Dich nicht selber bemühst das Klassenkonzept zu verstehen, wirst Du es nie begreifen. Wir helfen hier im Forum gerne, sind aber nicht dafür da Deine Hausaufgaben zu machen.

Unter http://www.b.shuttle.de/b/humboldt-os/p ... n2dex.html wird das Klassenkonzept schön an einem Beispiel demonstriert.


Gruß

Dookie
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Samstag 22. November 2003, 18:21

Hallo!
Tux hat geschrieben:@voges: danke schon mal... Ich brauch aber die anderen 3 Sachen auch als Extraklasse
In meinem Beispiel wird eine Etage nur durch einen Integerwert in der Liste self._etagen repräsentiert. Ich halte es zwar für Overkill, aber anstelle des Integerwertes kann Du da auch eine Etagen-Objekt reinpacken, dass dann eben die geforderten Methoden hat. Dann hast Du Deine beiden wesentlichen Klassen.
Wo man in das System Vererbung reinbauen soll, ist mir allerdings unklar. Vielleicht im GUI-Teil.
Jan
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Sonntag 23. November 2003, 19:23

Tux hat geschrieben:@hans: ich habe bisher einmal was mit Klassen zu tun gehabt und das war ne Abschreibübung im Unterricht... -- ich hab eigentlich keinen Plan von Klassen -- in dem Skript soll es aber nur mit Klassen gehen...
Ich wollte dich keinesfalls entmutigen. In deinem Fall scheint es mir aber besser zu sein, dass du das Modell komplett neu aufsetzt statt ein vorhandenes Script zu umzumodeln. Man schleppt sonst oft zuviel "Müll" mit herum, egal welche Sprache du verwendest. Sollte mal so am Rande erwähnt werden. (Die Menge an Sourcecode ist ja noch Übersichtlich, aber dass kann sich auch ganz schnell ändern)

Wie man sieht, hast du ja schon tatkräftige Mithilfe.

Hans
Tux
User
Beiträge: 70
Registriert: Freitag 8. November 2002, 23:07
Kontaktdaten:

Sonntag 23. November 2003, 20:37

@Voges:
wenn das so ist, dann werd ich es so lassen...

@Hans:
ich versuche es mir zu merken

DANKE
Antworten