# -*-coding: iso-8859-1-*- # mk, 17.1.10 import Tkinter import tkSimpleDialog class Register(object): def __init__(self, canvas, x = 150, y = 30, b = 100, h = 80, name = 'r'): self.canvas = canvas self.OnChange = None self.name = name self.reg = canvas.create_rectangle(x,y,x+b,y+h,tag = name) self.wert = 123 self.label = canvas.create_text(x+5, y+3, text = str(self.name), anchor = 'nw', font = ('Helvetica', '10')) self.txt = canvas.create_text(x+b/2, y+h/2, text = str(self.wert), anchor = 'center', font = ('Helvetica', '26'), fill = '#0000ff') canvas.tag_bind(self.txt,'',self.OnClick) def OnClick(self, event): self.wert = tkSimpleDialog.askinteger('Register '+self.name+' setzen', '0 .. 255', minvalue = 0, maxvalue = 255) self.canvas.itemconfig(self.txt, text = str(self.wert)) if self.OnChange != None: self.OnChange(self.name,self.wert) def setWert(self,wert): self.wert = wert self.canvas.itemconfig(self.txt, text = str(self.wert)) class Bus(object): def __init__(self, canvas, x = 150, y = 30, b = 20, l = 200, name = 'b'): self.canvas = canvas self.name = name self.oben = self.canvas.create_line(x,y,x+l,y, tag = name) self.unten = self.canvas.create_line(x,y+b,x+l,y+b, tag = name) self.wert = None self.txt = canvas.create_text(x+l/2, y+b/2, text = str(self.wert), anchor = 'center', font = ('Helvetica', '8'), fill = '#0000ff') def setWert(self,wert): self.wert = wert self.canvas.itemconfig(self.txt, text = str(self.wert)) class Pfeil(object): def __init__(self, canvas, OnChange = None, x = 50, y = 30, b = 40, l = 100, name = 'p', o = 'n', farbe = '#00ff00'): self.canvas = canvas self.OnChange = OnChange self.name = name self.zustand = 0 self.farbe = farbe self.farben = ['',self.farbe] d = b//4 if o == 'n': self.pfeil = canvas.create_polygon(x+2*d,y,x,y+2*d,x+d,y+2*d,x+d,y+l,x+3*d,y+l, x+3*d,y+2*d,x+4*d,y+2*d, outline = self.farbe, fill = '', tag = name) elif o == 'w': self.pfeil = canvas.create_polygon(x,y+2*d,x+2*d,y+4*d,x+2*d,y+3*d,x+l,y+3*d, x+l,y+d,x+2*d,y+d,x+2*d,y, outline = self.farbe, fill = '', tag = name) elif o == 's': self.pfeil = canvas.create_polygon(x+2*d,y+l,x+4*d,y+l-2*d,x+3*d,y+l-2*d,x+3*d,y, x+d,y,x+d,y+l-2*d,x,y+l-2*d, outline = self.farbe, fill = '', tag = name) elif o == 'e': self.pfeil = canvas.create_polygon(x+l,y+2*d,x+l-2*d,y,x+l-2*d,y+d,x,y+d,x,y+3*d, x+l-2*d,y+3*d,x+l-2*d,y+4*d, outline = self.farbe, fill = '', tag = name) self.zustand = 0 canvas.tag_bind(self.pfeil,'',self.OnClick) def OnClick(self, event): self.zustand = 1 - self.zustand self.canvas.itemconfig(self.pfeil,fill = self.farben[self.zustand]) if self.OnChange != None: self.OnChange(self.name,self.zustand) def setZustand(self,wert): self.zustand = wert self.canvas.itemconfig(self.pfeil,fill = self.farben[self.zustand]) class View(Tkinter.Tk): def __init__(self): Tkinter.Tk.__init__(self) # Fenster self.title("Registertransfer 0") self.geometry('540x420') # Canvas self.c = Tkinter.Canvas(master=self,width=540,height=420,bg='white') self.c.place(x=0,y=0) # Register self.regA = Register(self.c, name = 'A', x = 50, y = 50, b = 100, h = 80) self.regB = Register(self.c, name = 'B', x = 350, y = 50, b = 100, h = 80) self.regC = Register(self.c, name = 'C', x = 250, y = 290, b = 100, h = 80) # Bus self.bus = Bus(self.c, x = 20, y = 200, b = 20, l = 500, name = 'Bus') # Pfeile self.p1 = Pfeil(self.c, x = 65, y = 135, l = 60, b = 30, o = 'n', farbe = '#00ff00', name = '1') self.p2 = Pfeil(self.c, x = 105, y = 135, l = 60, b = 30, o = 's', farbe = '#ff0000', name = '2') self.p3 = Pfeil(self.c, x = 365, y = 135, l = 60, b = 30, o = 'n', farbe = '#00ff00', name = '3') self.p4 = Pfeil(self.c, x = 405, y = 135, l = 60, b = 30, o = 's', farbe = '#ff0000', name = '4') self.p5 = Pfeil(self.c, x = 265, y = 225, l = 60, b = 30, o = 's', farbe = '#00ff00', name = '5') self.p6 = Pfeil(self.c, x = 305, y = 225, l = 60, b = 30, o = 'n', farbe = '#ff0000', name = '6') if __name__ == "__main__": # Test-Callbacks def regChange(name,wert): print 'Register '+name+' wurde auf '+str(wert)+' geändert.' def arrChange(name,wert): print 'Pfeil '+name+' wurde auf '+str(wert)+' geändert.' # v = View() v.regA.OnChange = regChange v.regB.OnChange = regChange v.regC.OnChange = regChange v.p1.OnChange = arrChange v.p2.OnChange = arrChange v.p3.OnChange = arrChange v.p4.OnChange = arrChange v.p5.OnChange = arrChange v.p6.OnChange = arrChange v.mainloop()