Seite 1 von 1

in Klassen umschreiben...

Verfasst: Freitag 21. November 2003, 23:09
von Tux
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

Verfasst: Samstag 22. November 2003, 00:49
von hans
Für 45 Euro die Stunde bin ich dabei :lol:

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

Hans

Re: in Klassen umschreiben...

Verfasst: Samstag 22. November 2003, 10:09
von Voges
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

Verfasst: Samstag 22. November 2003, 12:26
von Tux
@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) ...

Verfasst: Samstag 22. November 2003, 12:55
von Dookie
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

Verfasst: Samstag 22. November 2003, 18:21
von Voges
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

Verfasst: Sonntag 23. November 2003, 19:23
von hans
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

Verfasst: Sonntag 23. November 2003, 20:37
von Tux
@Voges:
wenn das so ist, dann werd ich es so lassen...

@Hans:
ich versuche es mir zu merken

DANKE