我有个想法,可以将几种画图的类用一个代理统一起来,
这样使用统一接口既可以画tk,也可以使用如PIL这样的画
图库,以下是代码:
#!/usr/bin/env python
#import Image, ImageDraw
from Tkinter import *
class DrawProxy:
def __init__(self,drawimp,palette):
self._draw = drawimp
self._palette = palette
def __getattr__(self, name):
return getattr(self._draw, name)
class tkDraw:
def create_line(self,x1,y1,x2,y2,fill='black'):
func = self._palette.create_line(x1,y1,x2,y2,fill)
self._palette.func(x1,y1,x2,y2,fill)
def create_rectangle(self,x1,y1,x2,y2,fill='black'):
self._palette.create_rectangle(x1,y1,x2,y2,fill)
class imDraw:
def create_line(self,x1,y1,x2,y2,fill='black'):
self._palette.line(x1,y1,x2,y2,fill)
def create_rectangle(self,x1,y1,x2,y2,fill='black'):
func = getattr(self._palette,'create_rectangle')
self._palette.func([x1,y1,x2,y2],fill)
if __name__ == "__main__":
root = Tk()
selarea = Canvas(root,width=200,height=200)
'''
im = Image.new('RGB',(200,200))
draw = ImageDraw.Draw(im)
palette = DrawProxy(imDraw,draw)
'''
palette = DrawProxy(tkDraw,selarea)
palette.create_line(0,0,50,50)
总是报错:
TypeError: unbound method create_line() must be called with tkDraw instance as first
argument (got int instance instead)
的确create_line应该使用tkDraw作为第一个参数,而不是DrawProxy,
这几天有点把我绕晕了,不知这种使用方式应该怎样写?
请大家发表意见,谢谢!