from tkinter import * from roboterwelt import * #--------------------------------------------------------------------------------- class Gui(object): def __init__(self, rob, welt): # Referenzattribute zum Datenmodell self.rob = rob self.welt = welt # Erzeugung des Fensters self.fenster = Tk() self.fenster.title("Roboterwelt") self.fenster.geometry('330x330') # Rahmen self.rahmenRoboter = Frame(master=self.fenster, background="gray") self.rahmenRoboter.place(x=5, y=5, width=320, height=320) # Canvas self.canvas = Canvas(master=self.rahmenRoboter, background="white", width=164, height=164) self.canvas.place(x=78, y=18) self.erzeugeWeltGrafik() self.erzeugeRoboterGrafik() # Button links self.buttonLinks = Button(master=self.rahmenRoboter, text="links", command=self.buttonLinksClick) self.buttonLinks.place(x=5, y=200, width=100, height=27) # Button schritt self.buttonSchritt = Button(master=self.rahmenRoboter, text="schritt", command=self.buttonSchrittClick) self.buttonSchritt.place(x=110, y=200, width=100, height=27) # Button rechts self.buttonRechts = Button(master=self.rahmenRoboter, text="rechts", command=self.buttonRechtsClick) self.buttonRechts.place(x=215, y=200, width=100, height=27) # Button Marke setzen self.buttonMarkeSetzen = Button(master=self.rahmenRoboter, text="Marke setzen", command=self.buttonMarkeSetzenClick) self.buttonMarkeSetzen.place(x=5, y=240, width=100, height=27) # Button Marke löschen self.buttonMarkeLoeschen = Button(master=self.rahmenRoboter, text="Marke loeschen", command=self.buttonMarkeLoeschenClick) self.buttonMarkeLoeschen.place(x=5, y=280, width=100, height=27) # Button Ziegel hinlegen self.buttonMarkeSetzen = Button(master=self.rahmenRoboter, text="Ziegel hinlegen", command=self.buttonZiegelHinlegenClick) self.buttonMarkeSetzen.place(x=215, y=240, width=100, height=27) # Button Ziegel aufheben self.buttonMarkeLoeschen = Button(master=self.rahmenRoboter, text="Ziegel aufheben", command=self.buttonZiegelAufhebenClick) self.buttonMarkeLoeschen.place(x=215, y=280, width=100, height=27) # Ereignisschreife self.fenster.mainloop() def erzeugeWeltGrafik(self): breiteCanvas = int(self.canvas.cget("width")) groesseX = self.welt.getFelderX() groesseY = self.welt.getFelderY() breiteZelle = breiteCanvas / groesseX # erzeuge die Rechteck-Objekte für die Felder # erzeuge die Text-Objekte für die Anzahl der Ziegel m_Rechteck = [] m_Text = [] for j in range(groesseY): l_Rechteck = [] l_Text = [] for i in range(groesseX): # betimme die Koordinaten der Ecken des Feldes x1 = i*breiteZelle+3 y1 = j*breiteZelle+3 x2 = (i+1)*breiteZelle+3 y2 = (j+1)*breiteZelle + 3 # bestimme die Farbe des Feldes if self.welt.getZiegel(i, j) > 0: farbe = "red" if self.welt.getMarke(i, j): farbe = "yellow" else: if self.welt.getMarke(i, j): farbe = "yellow" else: farbe = "white" # erzeuge das Rechteck-Objekt zum Feld l_Rechteck = l_Rechteck + [self.canvas.create_rectangle(x1, y1, x2, y2, fill=farbe)] # erzeuge das Text-Objekt zum Feld if self.welt.getZiegel(i, j) > 0: l_Text = l_Text + [self.canvas.create_text(x1 + breiteZelle/2, y1 + breiteZelle/2, text=str(welt.getZiegel(i, j)))] else: l_Text = l_Text + [self.canvas.create_text(x1 + breiteZelle/2, y1 + breiteZelle/2, text='')] m_Rechteck = m_Rechteck + [l_Rechteck] m_Text = m_Text + [l_Text] # verwalte die Rechteck- und Text-Objekte mit den folgenden Attributen self.id_felder = m_Rechteck self.id_texte = m_Text def erzeugeRoboterGrafik(self): breiteCanvas = int(self.canvas.cget("width")) groesseX = self.welt.getFelderX() groesseY = self.welt.getFelderY() breiteZelle = breiteCanvas / groesseX # bestimme die Eckpunkte des Roboterfeldes x1 = self.rob.getX()*breiteZelle + 3 y1 = self.rob.getY()*breiteZelle + 3 x2 = x1 + breiteZelle y2 = y1 + breiteZelle # bestimme die Eckpunkte des Dreiecks r = self.rob.getR() if r == 'O': (a_x, a_y) = (x1, y1) (b_x, b_y) = (x2, (y1+y2)/2) (c_x, c_y) = (x1, y2) elif r == 'S': (a_x, a_y) = (x1, y1) (b_x, b_y) = (x2, y1) (c_x, c_y) = ((x1+x2)/2, y2) elif r == 'W': (a_x, a_y) = (x2, y1) (b_x, b_y) = (x2, y2) (c_x, c_y) = (x1, (y1+y2)/2) elif r == 'N': (a_x, a_y) = (x2, y2) (b_x, b_y) = (x1, y2) (c_x, c_y) = ((x1+x2)/2, y1) farbe = "blue" # erzeuge ein Dreieck zum Roboter self.id_roboter = self.canvas.create_polygon(a_x, a_y, b_x, b_y, c_x, c_y, a_x, a_y ,fill=farbe) try: self.id_robotertext = self.canvas.create_text(x1 + breiteZelle/2, y1 + breiteZelle/2, fill="white", text=str(self.rob.getRucksack())) except: pass def aktualisiereWeltGrafik(self): groesseX = self.welt.getFelderX() groesseY = self.welt.getFelderY() for j in range(groesseY): for i in range(groesseX): # bestimme die Farbe des Feldes if self.welt.getZiegel(i, j) > 0: farbe = "red" if self.welt.getMarke(i, j): farbe = "yellow" else: if self.welt.getMarke(i, j): farbe = "yellow" else: farbe = "white" # aktualisiere die Farbe und den Text des Rechtecks zum Feld self.canvas.itemconfigure(self.id_felder[j][i], fill=farbe) if self.welt.getZiegel(i, j) > 0: self.canvas.itemconfigure(self.id_texte[j][i], text=str(self.welt.getZiegel(i, j))) else: self.canvas.itemconfigure(self.id_texte[j][i], text='') def aktualisiereRoboterGrafik(self): # lösche das aktuelle Roboter-Dreieck self.canvas.delete(self.id_roboter) #self.canvas.delete(self.id_robotertext) breiteCanvas = int(self.canvas.cget("width")) groesseX = self.welt.getFelderX() groesseY = self.welt.getFelderY() breiteZelle = breiteCanvas / groesseX # bestimme die Eckpunkte des Roboterfeldes x1 = self.rob.getX()*breiteZelle + 3 y1 = self.rob.getY()*breiteZelle + 3 x2 = x1 + breiteZelle y2 = y1 + breiteZelle # bestimme die Eckpunkte des Dreiecks r = self.rob.getR() if r == 'O': (a_x, a_y) = (x1, y1) (b_x, b_y) = (x2, (y1+y2)/2) (c_x, c_y) = (x1, y2) elif r == 'S': (a_x, a_y) = (x1, y1) (b_x, b_y) = (x2, y1) (c_x, c_y) = ((x1+x2)/2, y2) elif r == 'W': (a_x, a_y) = (x2, y1) (b_x, b_y) = (x2, y2) (c_x, c_y) = (x1, (y1+y2)/2) elif r == 'N': (a_x, a_y) = (x2, y2) (b_x, b_y) = (x1, y2) (c_x, c_y) = ((x1+x2)/2, y1) farbe = "blue" # erzeuge ein neues Dreieck self.id_roboter = self.canvas.create_polygon(a_x, a_y, b_x, b_y, c_x, c_y, a_x, a_y ,fill=farbe) try: self.id_robotertext = self.canvas.create_text(x1 + breiteZelle/2, y1 + breiteZelle/2, fill="white", text=str(self.rob.getRucksack())) except: pass def buttonSchrittClick(self): self.rob.schritt() self.aktualisiereRoboterGrafik() def buttonLinksClick(self): self.rob.links() self.aktualisiereRoboterGrafik() def buttonRechtsClick(self): self.rob.rechts() self.aktualisiereRoboterGrafik() def buttonMarkeSetzenClick(self): self.rob.markeSetzen() self.aktualisiereWeltGrafik() self.aktualisiereRoboterGrafik() def buttonMarkeLoeschenClick(self): self.rob.markeLoeschen() self.aktualisiereWeltGrafik() self.aktualisiereRoboterGrafik() def buttonZiegelHinlegenClick(self): self.rob.ziegelHinlegen() self.aktualisiereWeltGrafik() self.aktualisiereRoboterGrafik() def buttonZiegelAufhebenClick(self): self.rob.ziegelAufheben() self.aktualisiereWeltGrafik() self.aktualisiereRoboterGrafik() # Erzeugung der Datenmodell-Objekte welt = Welt(5, 5) rob = Roboter() rob.setWelt(welt) # Erzeugung des Gui-Objekts gui = Gui(rob, welt)