[Tutor] color vector

Shi Mu samrobertsmith at gmail.com
Sun Nov 6 12:27:12 CET 2005


why the following code does not work?

"""
Tkinter Color Vector Objects

Just the bare minimum to create re-sizable
and re-usable color icons in tkinter.
"""

import Tkinter as Tk
import math
""" Get points for a unit regular-polygon with n sides. """
def getregpoly(sides):
    points = []
    ang = 2*math.pi / sides
    for i in range(sides):
        deg = (i+.5)*ang
        points.append(math.sin(deg)/2.0+.5)
        points.append(math.cos(deg)/2.0+.5)
    return points

def scale(points, scale):
    return [x*scale for x in points]

def move(points, x, y):
    xy = [x,y]*(len(points)//2)
    return [xy+coord for xy, coord in zip(xy,points)]

def translate(obj, x, y, zoom):
    p = scale(obj.points, obj.size)
    p = move(p, obj.x, obj.y)
    p = scale(p, zoom)
    return move(p, x, y)

def draw(obj, c, x=0 ,y=0, zoom=1):
    p = translate(obj, x, y, zoom)
    if obj.obj=='line':
        c.create_line( p, fill=obj.fill, width=obj.width, arrow=obj.arrow)
    elif obj.obj=='rectangle':
        c.create_line( p, fill=obj.fill, outline=obj.outline,width=obj.width)
    elif obj.obj=='polygon':
        c.create_polygon( p, fill=obj.fill,
outline=obj.outline,width=obj.width,smooth=obj.smooth)
    elif obj.obj=='text':
        size = int(obj.size*zoom)
        font = (obj.font,size,obj.style)
        c.create_text(p, text=obj.text, font=font, fill=obj.fill)
    elif obj.obj=='oval':
        c.create_oval( p, fill=obj.fill, outline=obj.outline,width=obj.width )
    elif obj.obj=='arc':
        c.create_arc( p, start=obj.start,
extent=obj.extent,style=obj.style, fill=obj.fill,outline=obj.outline,
width=obj.width)

class Shape(object):
    size = 1
    x = y = 0
    def __init__(self, **kwds):
        self.__dict__.update(kwds)
    def __call__(self, *args, **kwds):
        for key in self.__dict__:
            if key not in kwds:
                kwds[key] = self.__dict__[key]
        return self.__class__(*args, **kwds)

def draw(self, c, x=0, y=0, scale=1.0):
    draw(self, c, x, y, scale)

class Group(list):
    obj = 'group'
    def __init__(self, *args, **kwds):
        self[:] = args
        self.__dict__.update(kwds)
    def __call__(self, *args, **kwds):
        args = self[:]+list(args)
        for key in self.__dict__:
            if key not in kwds:# make copies
                kwds[key] = self.__dict__[key]()
                return self.__class__(*args, **kwds)
    def draw(self, c, x=0, y=0, scale=1.0):
        for item in self:
            item.draw(c, x, y, scale)
            for key in self.__dict__:
                self.__dict__[key].draw(c, x, y, scale)

# base shapes.
text = Shape( obj='text', text='', fill='black', width=0,font='',
style='', points=[0,0] )
line = Shape( obj='line', arrow='none', fill='black',smooth='false',
width=1, points=[0,0,1,0])
rectangle = Shape( obj='rectangle', fill='', outline='black',width=1,
points=[0,0,1,.5])
polygon = Shape( obj='polygon', fill='grey', outline='',width=0,
points=[0,0], smooth='false' )
oval = Shape( obj='oval', fill='grey', outline='',width=0, points=[0,0,1,.75] )
arc = Shape( obj='arc', fill='grey', outline='', width=0,style='arc',
start='0', extent='90',points=[0,0,1,1])

# shape variations
chord = arc(style='chord')
pie = arc(style='pieslice')
circle = oval(points=[0,0,1,1])
square = rectangle(points=[0,0,1,1])
triangle = polygon( points=getregpoly(3))
octagon = polygon( points=getregpoly(8))

# CAUTION ICON
caution = Group(
triangle(x=6, y=5, size=75),
triangle(size=75, fill='yellow'),
txt = text( text='!',
x=38, y=32, size=30,
font='times', style='bold') )

# ERROR ICON
circlepart = chord( x=15, y=15, size=25, fill='red',
start='140', extent='155' )
error = Group(
octagon(x=6, y=5, size=56),
octagon(size=56, fill='red'),
circle(x=9, y=9, size=37, fill='white'),
circlepart(),
circlepart(start='320') )

# QUESTION & INFO ICONS
bubbletip = polygon(points=[34,42,60,56,50,38])
question = Group(
bubbletip(x=6, y=5),
oval(x=6, y=5, size=60),
bubbletip(fill='lightblue'),
oval(size=60, fill='lightblue'),
txt = text( text='?',
x=31, y=22, size=28,
font='times', style='bold' ) )
info = question()
info.txt.text = 'i'

if __name__ == '__main__':
    root = Tk.Tk()
    root.title('Resizable Shapes')
    c = Tk.Canvas(root)

caution.draw(c,40,20,.5)
error.draw(c,120,20,1)
question.draw(c,210,20,2)
info.draw(c,50,100)

logo = caution() # get a copy
logo.txt = text( text='&', fill='#00bb44',
x=39, y=34, size=30 )
logo.draw(c,135,110,1.3)

message = text( text="What's Your Size?",
size=15, fill='white' )
Group( message( x=1, y=1, fill='grey30'),
message() ).draw(c,190,235,2)

line( width=3, fill='darkgrey', arrow='both').draw(c,20,205,336)

c.pack()
root.mainloop()


More information about the Tutor mailing list