# mk, 26.3.09 # model class Automat(object): def __init__(self,OnChange): self.name = 'Getränkeautomat 1' self.zustaende = ('z0','z50','z100','z150') self.eingaben = ('e50','e100','eKorr','eWare') self.ausgaben = ('aNichts','a50','a100','a150','aGetr') self.f = [[(1,0),(2,0),(0,0),(0,0)],[(2,0),(3,0),(0,1),(0,0)], [(3,0),(2,2),(0,2),(2,0)],[(3,1),(3,2),(0,3),(0,4)]] self.zustand = 0 self.ausgabe = None self.eingabe = None self.OnChange = OnChange def ein(self,eingabe): if type(eingabe) == str: eingabe = list(self.eingaben).index(eingabe) assert (type(eingabe) == int) and (0 <= eingabe < len(self.eingaben)) self.eingabe = eingabe (self.zustand,self.ausgabe) = self.f[self.zustand][self.eingabe] assert 0 <= self.zustand < len(self.zustaende) assert 0 <= self.ausgabe < len(self.ausgaben) if self.OnChange != None: self.OnChange() # view from tkinter import * class View(Tk): def __init__(self,cbTaste,automat): Tk.__init__(self) # Fenster try: self.title(automat.name) except: self.title('Automat') self.geometry('400x360') # Labels self.lZ = Label(self,text='Zustand') self.lZ.place(x=10,y=35) self.lE = Label(self,text='Eingabe') self.lE.place(x=10,y=75) self.lA = Label(self,text='Ausgabe') self.lA.place(x=10,y=115) self.lEin = Label(self,text='Eingaben') self.lEin.place(x=160,y=10) self.lAus = Label(self,text='Ausgaben') self.lAus.place(x=280,y=10) # Optionmenus self.vZ = StringVar(master=self) self.vZ.set(automat.zustaende[0]) self.oZ = OptionMenu(self,self.vZ,*automat.zustaende) self.oZ.place(x=60,y=30, width=80) self.vE = StringVar(master=self) self.vE.set(automat.eingaben[0]) self.oE = OptionMenu(self,self.vE,*automat.eingaben) self.oE.place(x=60,y=70, width=80) self.vA = StringVar(master=self) self.vA.set(automat.ausgaben[0]) self.oA = OptionMenu(self,self.vA,*automat.ausgaben) self.oA.place(x=60,y=110, width=80) # Button self.b = Button(self,text='bearbeite') self.b.bind('<1>',cbTaste) self.b.place(x=60,y=170,width=78) # Listboxes self.lbE = Listbox(self) self.lbE.place(x=160,y=30,width=100,height=300) self.lbA = Listbox(self) self.lbA.place(x=280,y=30,width=100,height=300) # controller class Controller(object): def __init__(self): self.model = Automat(self.update) self.view = View(self.taste,self.model) self.view.mainloop() def update(self): # Eingabe in Listbox Eingaben self.view.lbE.insert(END,self.model.eingaben[self.model.eingabe]) # Zustand setzen self.view.vZ.set(self.model.zustaende[self.model.zustand]) # Ausgabe setzen self.view.vA.set(self.model.ausgaben[self.model.ausgabe]) # Ausgabe in Listbox Ausgaben self.view.lbA.insert(END,self.model.ausgaben[self.model.ausgabe]) def taste(self,event): # Zustandsnummer ermitteln z = list(self.model.zustaende).index(self.view.vZ.get()) # Eingabenummer ermitteln e = list(self.model.eingaben).index(self.view.vE.get()) # zu DEBUGGING-Gründen Zustand setzen self.model.zustand = z # Automat arbeiten lassen self.model.ein(e) # Hauptprogramm c = Controller()