# draws an impossible tribar # # style of Oscar Reutersvärd, 1934 # Wolfgang.Urban@schule.at NOT_IN_IDLE = 1 from Tkinter import * from math import * # draw a full cube class Cube: def __init__(self,parent,x,y,s): dx,dy = s/2.0*sqrt(3.0),s/2.0 parent.create_polygon(x-dx,y-dy,x,y,x+dx,y-dy,x,y-s,x-dx,y-dy, fill="#30e030",outline="#000000",width=4) parent.create_polygon(x-dx,y-dy,x,y,x,y+s,x-dx,y+dy,x-dx,y-dy, fill="#e08080",outline="#000000",width=4) parent.create_polygon(x+dx,y-dy,x,y,x,y+s,x+dx,y+dy,x+dx,y-dy, fill="#b0b0ff",outline="#000000",width=4) # only left and top class Cube_Part: def __init__(self,parent,x,y,s): dx,dy = s/2.0*sqrt(3.0),s/2.0 parent.create_polygon(x-dx,y-dy,x,y,x+dx,y-dy,x,y-s,x-dx,y-dy, fill="#30e030",outline="#000000",width=4) parent.create_polygon(x-dx,y-dy,x,y,x,y+s,x-dx,y+dy,x-dx,y-dy, fill="#e08080",outline="#000000",width=4) class CanvasFrame(Frame): def __init__(self,parent,sizex,sizey,use_trick): Frame.__init__(self,parent,border=2,relief=RIDGE) self.cv = Canvas(self,width=sizex,height=sizey,bg="#ffffff") self.cv.pack() self.pack() self.update() s = sizey/7.2 dvy = s*3.0/2.0 dx = 3.0/4*s*sqrt(3) dy = 3.0*s/4 x,y = 105,105 Cube(self.cv,x+1*dx,y+1*dy,s) Cube(self.cv,x+2*dx,y+2*dy,s) Cube(self.cv,x+3*dx,y+3*dy,s) Cube(self.cv,x+2*dx,y+4*dy,s) Cube(self.cv,x+1*dx,y+5*dy,s) Cube(self.cv,x+0*dx,y+6*dy,s) Cube(self.cv,x+0*dx,y+2*dvy,s) Cube(self.cv,x+0*dx,y+1*dvy,s) Cube(self.cv,x+0*dx,y+0*dvy,s) if use_trick: Cube_Part(self.cv,x+1*dx,y+1*dy,s) if NOT_IN_IDLE: self.mainloop() class TriBar: def __init__(self,use_trick=1): self.root = Tk() self.root.title("The Tribar") self.cf = CanvasFrame(self.root,520,580,use_trick) self.cf.pack() d = TriBar(1) # (0) gives real tribar