On Jun 29, 4:47 pm, Lie <[EMAIL PROTECTED]> wrote: > On Jun 29, 11:18 am, [EMAIL PROTECTED] wrote: > > > > > Ok I'm a Python noob, been doing OK so far, working on a data > > conversion program and want to create some character image files from > > an 8-bit ROM file. > > > Creating the image I've got down, I open the file and use TK to draw > > the images... but > > > 1) It does not seem to end (running in IDLE), I have to kill the > > process to retry it seems tkinter does not close(?) > > > 2) Once I added the Image module open won't open my binary file > > (complains its not an image file, which is isnt.) I am sure I need to > > prefix open with something but I can't seem to find an example of how > > to word it, > > > Below is the code (if it is lousy its because I've mainly been > > borrowing by examples as I go...) Any suggestions are gretly > > appreciated. > > > #!/usr/local/bin/python > > > from Tkinter import * > > from string import * > > from Image import * > > DON'T DO THAT... > > You're importing everything to the current namespace and this corrupts > the current namespace, specifically the 'open' function inside > Image.open would shadow the built-in 'open' function. > > use: > import Tkinter > import string > import Image > > There are use cases where doing 'from blah import *' is useful, such > as importing constants, but in general try to avoid importing > everything to current namespace. > > > root = Tk() > > root.title('Canvas') > > If you used 'import Tkinter', you'd have to change that code to: > root = Tkinter.Tk() > > > #open commodore Cset rom > > cset = open("chargen","r") > > Because you shadowed the built-in 'open' with the 'from Image import > *', this would call Image.open instead of the built-in open. > > > canvas = Canvas(width=16, height=16, bg='white') > > If you used 'import Tkinter', you'd have to change that code to: > canvas = Tkinter.Canvas(...) > > > canvas.pack(expand=YES, fill=BOTH) > > > # character size factor > > size = 2 > > > # read all 512 characters from ROM > > for cchar in range(0, 511, 1): > > You can use this instead: > for cchar in range(511): > > but beware, this creates range with length 511 (so do the original > range), which means you're lacking on space for the last char. > You probably wanted this instead: > for cchar in range(512): > > But again, python can loop directly over string/list/file, etc, so > this might be best: > for char in cset.read(): > > > #draw line > > while charline < 8: > > position = 0 > > x = cset.read(1) > > ch = ord(x) > > # draw pixels > > while position < 8: > > if ch & ( 2 ** position ): > > xp = 1+(7-position)*size > > yp = 1+charline*size > > canvas.create_rectangle(xp,yp,xp+size,yp+size, > > fill='black', width=0) > > position += 1 > > Since you're planning to use Image module (from PIL/Python Imaging > Library) why not use functions from Image instead to create the image. > The format of the file you're using seems to be RAW format (i.e. > simple uncompressed bitmap, without any kinds of header). That means > Image.fromstring() should work. > > > charline += 1 > > #save character image > > outfile = "/home/mydir/work/char"+zfill(cchar,3)+".png" > > canvas.save(outfile,"png") > > #clear canvas for next char... > > canvas.create_rectangle(1,1,size*8,size*8, fill='white', width=0) > > root.mainloop() > >
btw, PIL Handbook is a good tutorial/reference for Python Imaging Library: http://www.pythonware.com/library/pil/handbook/index.htm for info on raw mode: http://www.pythonware.com/library/pil/handbook/decoder.htm -- http://mail.python.org/mailman/listinfo/python-list