I use python 2.4.1 and PIL 1.1.5 and when I execute my program I got error:
./code.py Traceback (most recent call last): File "./code.py", line 7, in ? class DrawPlus(ImageDraw.Draw): TypeError: Error when calling the metaclass bases function() argument 1 must be code, not str Why I got this error? It work good on python 2.3 + PIL 1.1.4 #!/usr/bin/env python # -*- coding: iso8859-1 -*- import random import Image, ImageFont, ImageDraw class DrawPlus(ImageDraw.Draw): def __init__(self, im, mode=None): ImageDraw.Draw.__init__(self, im, mode=None) def text(self, xy, text, fill=None, font=None, angle=None, anchor=None): ink, fill = self._getink(fill) if font is None: font = self.getfont() if ink is None: ink = fill if ink is not None: bitmap = font.getmask(text) if angle is not None: bitmap = bitmap.rotate(angle, Image.BILINEAR) self.draw.draw_bitmap(xy, bitmap, ink) class ImageRandomCode: def __init__(self, filename, size=None): # plain text code self.code = '' # code image file name self.filename = filename # fonts import glob dir = 'fonts/*.ttf' self.fonts = glob.glob(dir) # chars tuple #self.chars = chars or ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z') self.chars = ('0','1','2','3','4','5','6','7','8','9') # image width self.img_width = 100 # image height self.img_height = 30 # image size = (image width, image height) self.img_size = size or (self.img_width, self.img_height) # image background color (r,g,b) self.img_background_color = (255, 255, 255) # image font color (r,g,b) self.img_font_color = (0, 0, 0) # code length self.length = 5 # minimum font size self.font_size_min = 13 # 12 # maximum font size self.font_size_max = 18 # maximum noise lines to draw self.lines_noise_max = 3 # maximum noise pixels to draw self.pixels_noise_percent = 3 # 5 # maximum char angle self.angle_max = 15 # 20 img = Image.new('RGB', self.img_size, self.img_background_color) self.draw = DrawPlus(img) self.draw_chars() self.draw_noise() del self.draw img.save(self.filename) def draw_noise(self): self.draw_noise_pixels() self.draw_noise_lines() def get_code(self): return self.code def get_filename(self): return self.filename def draw_chars(self, chars=None, length=None): chars = chars or self.chars length = length or self.length for i in range(length): font_size = random.randint(self.font_size_min, self.font_size_max) font_name = random.choice(self.fonts) font = ImageFont.truetype(font_name, font_size) angle = random.randint(-self.angle_max, +self.angle_max) text = random.choice(chars) size = self.draw.textsize(text, font=font) x = i*(self.img_width-2-2)/length y = random.randint(2, self.img_height-size[1]-2) self.draw.text((x,y), text, font=font, angle=angle, fill=self.img_font_color) self.code += text def draw_noise_pixels(self, percent=None): percent = percent or self.pixels_noise_percent N = int(self.img_width*self.img_height*percent/100) for i in range(N): x = random.randint(0, self.img_width) y = random.randint(0, self.img_height) self.draw.point((x,y), fill=self.img_font_color) for i in range(N): x = random.randint(0, self.img_width) y = random.randint(0, self.img_height) self.draw.point((x,y), fill=self.img_background_color) def draw_noise_lines(self, max=None): max = max or self.lines_noise_max N = random.randint(0, max) for i in range(N): x1 = random.randint(0, self.img_width) y1 = random.randint(0, self.img_height) x2 = random.randint(0, self.img_width) y2 = random.randint(0, self.img_height) self.draw.line((x1,y1,x2,y2), fill=(0,0,0)) code = ImageRandomCode('test.png') print code.get_code() -- http://mail.python.org/mailman/listinfo/python-list