tkinter blues (greens, reds, ...)

Sean McIlroy sean_mcilroy at yahoo.com
Fri Oct 28 17:28:36 EDT 2005


i'm using the canned colors ("pink", "orange", etc). should i try
changing to explicit color specifications to see if that makes a
difference? i'm not sure what the other guy meant by a "soft toy", but
i take it the idea is to try and construct a correctness proof for the
script, and see what keeps it (the proof) from working. it's a sound
idea, of course, but the script is pretty darn straightforward, as you
can see (below). anyway, i'll let you know how it turns out.

peace

############################


green  = 'green'

orange = 'orange'

pink   = 'pink'

yellow = 'yellow'

red    = 'red'

blue   = 'blue'



fb = 'frontback'

ud = 'updown'

lr = 'leftright'



def select(x,a,b): return b[a.index(x)]

def frontback(orientation): return
select(orientation,[fb,ud,lr],[fb,lr,ud])

def updown(orientation): return
select(orientation,[fb,ud,lr],[lr,ud,fb])

def leftright(orientation): return
select(orientation,[fb,ud,lr],[ud,fb,lr])



class cell:

    def __init__(self, circlecolor, pointercolor, orientation,
coordinates):

        self.circlecolor  = circlecolor

        self.pointercolor = pointercolor

        self.orientation  = orientation

        self.coordinates  = coordinates

    def endpoint(self):

        a,b = self.coordinates

        if self.orientation==fb:

            if abs(a)==1: return [2*a,2*b]

            if abs(a)==2: return [a/2,b/2]

        if self.orientation==ud: return [+a,-b]

        if self.orientation==lr: return [-a,+b]



class cube:

    def __init__(self):

        self.ful = cell(green,  blue, fb, [-2,+2])

        self.fur = cell(orange, blue, fb, [+2,+2])

        self.fdl = cell(pink,   blue, fb, [-2,-2])

        self.fdr = cell(yellow, blue, fb, [+2,-2])

        self.bul = cell(green,  red,  fb, [-1,+1])

        self.bur = cell(orange, red,  fb, [+1,+1])

        self.bdl = cell(pink,   red,  fb, [-1,-1])

        self.bdr = cell(yellow, red,  fb, [+1,-1])

        self.cells =
[self.ful,self.fur,self.fdl,self.fdr,self.bul,self.bur,self.bdl,self.bdr]

    def redraw(self,*cells):

        for x in cells:

            A = x.coordinates

            B = x.endpoint()

            erase(*A)

            drawpointer(color=x.pointercolor,*(A+B))

            drawcircle(color=x.circlecolor,*A)

    def display(self):

        self.redraw(*self.cells)

    def cycle(self,a,b,c,d,funct):

        x = d.circlecolor

        y = d.pointercolor

        z = funct(d.orientation)

        d.circlecolor  = c.circlecolor

        d.pointercolor = c.pointercolor

        d.orientation  = funct(c.orientation)

        c.circlecolor  = b.circlecolor

        c.pointercolor = b.pointercolor

        c.orientation  = funct(b.orientation)

        b.circlecolor  = a.circlecolor

        b.pointercolor = a.pointercolor

        b.orientation  = funct(a.orientation)

        a.circlecolor  = x

        a.pointercolor = y

        a.orientation  = z





rubik = cube()



def F1_():
rubik.cycle(rubik.ful,rubik.fur,rubik.fdr,rubik.fdl,frontback)

def F2_():
rubik.cycle(rubik.fdl,rubik.fdr,rubik.fur,rubik.ful,frontback)

def B1_():
rubik.cycle(rubik.bdl,rubik.bdr,rubik.bur,rubik.bul,frontback)

def B2_():
rubik.cycle(rubik.bul,rubik.bur,rubik.bdr,rubik.bdl,frontback)



def U1_(): rubik.cycle(rubik.bul,rubik.bur,rubik.fur,rubik.ful,updown)

def U2_(): rubik.cycle(rubik.ful,rubik.fur,rubik.bur,rubik.bul,updown)


def D1_(): rubik.cycle(rubik.bdl,rubik.bdr,rubik.fdr,rubik.fdl,updown)

def D2_(): rubik.cycle(rubik.fdl,rubik.fdr,rubik.bdr,rubik.bdl,updown)



def L1_():
rubik.cycle(rubik.ful,rubik.bul,rubik.bdl,rubik.fdl,leftright)

def L2_():
rubik.cycle(rubik.fdl,rubik.bdl,rubik.bul,rubik.ful,leftright)

def R1_():
rubik.cycle(rubik.fur,rubik.bur,rubik.bdr,rubik.fdr,leftright)

def R2_():
rubik.cycle(rubik.fdr,rubik.bdr,rubik.bur,rubik.fur,leftright)



def F1(): F1_(); rubik.redraw(rubik.ful,rubik.fur,rubik.fdr,rubik.fdl)

def F2(): F2_(); rubik.redraw(rubik.fdl,rubik.fdr,rubik.fur,rubik.ful)

def B1(): B1_(); rubik.redraw(rubik.bdl,rubik.bdr,rubik.bur,rubik.bul)

def B2(): B2_(); rubik.redraw(rubik.bul,rubik.bur,rubik.bdr,rubik.bdl)

def U1(): U1_(); rubik.redraw(rubik.bul,rubik.bur,rubik.fur,rubik.ful)

def U2(): U2_(); rubik.redraw(rubik.ful,rubik.fur,rubik.bur,rubik.bul)

def D1(): D1_(); rubik.redraw(rubik.bdl,rubik.bdr,rubik.fdr,rubik.fdl)

def D2(): D2_(); rubik.redraw(rubik.fdl,rubik.fdr,rubik.bdr,rubik.bdl)

def L1(): L1_(); rubik.redraw(rubik.ful,rubik.bul,rubik.bdl,rubik.fdl)

def L2(): L2_(); rubik.redraw(rubik.fdl,rubik.bdl,rubik.bul,rubik.ful)

def R1(): R1_(); rubik.redraw(rubik.fur,rubik.bur,rubik.bdr,rubik.fdr)

def R2(): R2_(); rubik.redraw(rubik.fdr,rubik.bdr,rubik.bur,rubik.fur)



def solve():

    rubik.__init__()

    rubik.display()



def scramble():

    n = 15

    from random import randint

    f = [F1_,F2_,B1_,B2_,U1_,U2_,D1_,D2_,L1_,L2_,R1_,R2_]

    for i in range(n): f[randint(0,11)]()

    rubik.display()



canvaswidth = 380

canvasheight = 330



def coordinates(x,y): return (canvaswidth/2+68*x),(canvasheight/2-68*y)



def drawcircle(x,y,color):

    r = (20,15)[abs(x)==1]

    a,b = coordinates(x,y)

    canvas.create_oval(a-r,b-r,a+r,b+r,fill=color)



def drawpointer(x1,y1,x2,y2,color):

    a1,b1 = coordinates(x1,y1)

    a2,b2 = coordinates(float(x1+x2)/2,float(y1+y2)/2)

    canvas.create_line(a1,b1,a2,b2,width=2,fill=color,arrow=LAST)



def erase(x,y):

    a,b = coordinates(x,y)

    p = canvas.find_overlapping(a-10,b-10,a+10,b+10)

    q = [x for x in p if canvas.type(x) in ('oval','line')]

    for x in q: canvas.delete(x)



def drawbackground():

    A = coordinates(+1,+1)

    B = coordinates(+1,-1)

    C = coordinates(-1,+1)

    D = coordinates(-1,-1)

    E = coordinates(+2,+2)

    F = coordinates(+2,-2)

    G = coordinates(-2,+2)

    H = coordinates(-2,-2)

    canvas.create_polygon(fill='',outline='black',*(C+A+E+G+C))

    canvas.create_polygon(fill='',outline='black',*(C+G+H+D+C))

    canvas.create_polygon(fill='',outline='black',*(A+E+F+B+A))

    canvas.create_polygon(fill='',outline='black',*(H+F+B+D+H))



from Tkinter import *

root = Tk()

########################################################

back = Frame(root,borderwidth=3)

back.pack(side=TOP)

Button(back,text='<<<<',command=B1).pack(side=LEFT)

Label(back,width=10,text='BACK').pack(side=LEFT)

Button(back,text='>>>>',command=B2).pack(side=LEFT)

########################################################

top = Frame(root,borderwidth=3)

top.pack(side=TOP)

Button(top,text='<<<<',command=U1).pack(side=LEFT)

Label(top,width=10,text='TOP').pack(side=LEFT)

Button(top,text='>>>>',command=U2).pack(side=LEFT)

########################################################

mid = Frame(root)

mid.pack(side=TOP)

left = Frame(mid,borderwidth=5)

left.pack(side=LEFT)

Button(left,text='^\n^',width=3,command=L1).pack(side=TOP)

Label(left,height=6,text='L\nE\nF\nT').pack(side=TOP)

Button(left,text='v\nv',width=3,command=L2).pack(side=TOP)

canvas = Canvas(mid,width=canvaswidth,height=canvasheight)

canvas.pack(side=LEFT,expand=1,fill=BOTH)

right = Frame(mid,borderwidth=5)

right.pack(side=LEFT)

Button(right,text='^\n^',width=3,command=R1).pack(side=TOP)

Label(right,height=6,text='R\nI\nG\nH\nT').pack(side=TOP)

Button(right,text='v\nv',width=3,command=R2).pack(side=TOP)

########################################################

bottom = Frame(root,borderwidth=3)

bottom.pack(side=TOP)

Button(bottom,text='<<<<',command=D1).pack(side=LEFT)

Label(bottom,width=10,text='BOTTOM').pack(side=LEFT)

Button(bottom,text='>>>>',command=D2).pack(side=LEFT)

########################################################

front = Frame(root,borderwidth=3)

front.pack(side=TOP)

Button(front,text='<<<<',command=F1).pack(side=LEFT)

Label(front,width=10,text='FRONT').pack(side=LEFT)

Button(front,text='>>>>',command=F2).pack(side=LEFT)

########################################################

ctrl = Frame(root,borderwidth=20)

ctrl.pack(side=TOP)

Button(ctrl,text='SOLVE',command=solve).pack(side=LEFT)

Label(ctrl,width=3,text='').pack(side=LEFT)

Button(ctrl,text='SCRAMBLE',command=scramble).pack(side=LEFT)

########################################################

root.title('rubik')

drawbackground()

rubik.display()

root.mainloop()




More information about the Python-list mailing list