0

I need to implement a function in Gui so you press the buttuon mirror, it calls the function flip, and display the img in the Gui.
Assume that the picture inserted to mirror/flip is B&W img.
I checked flip and it works fine, but not when Im trying to combine it in the Gui.
what am I missing?

def flip(im):
    '''Flips a picutre horizontally, and returns a new image that is a mirror view of the original'''
    org=Image.open(im)
    new=Image.new("L",org.size)   
    for x in range(org.size[0]):
        for y in range(org.size[1]):
            pixel=org.getpixel((x,y))
            new.putpixel((org.size[0]-x-1,y),pixel)
    return new

def mirror():
    '''Flips the image like a mirror does, left to right'''
    global img
    out = Image.new('L',img.size, 'white')
    out=flip(img)
    img = out  
    display() 

def display():
    delete()
    global img
    global photo
    photo = ImageTk.PhotoImage(img)
    canvas.create_image(250, 250, image=photo)
    canvas.pack()

### GUI packing ###
g = Gui()    
g.title('PhotoPy 0.2')
global img
### canvas
canvas=g.ca(500, 500, bg='white')

### menu 
g.row(weights=[1,0,0,0])
filename = g.en(text='python.bmp', width=16)
g.bu(text='...', command=browse)
g.bu(text='Save', command=save)
g.bu(text='Load', command=load)
g.bu(text='Mirror', command=mirror)
g.endrow() 
### start
g.mainloop()

I get this error msg:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1410, in __call__
    return self.func(*args)
  ... line 87, in mirror
    out=flip(img)
  ... line 24, in flip
    org=Image.open(im)
  ... line 1956, in open
    prefix = fp.read(16)
  ... in __getattr__
    raise AttributeError(name)
AttributeError: read
user1816377
  • 235
  • 3
  • 6
  • 15

1 Answers1

1

Assuming Image is pil.Image, the open function expects a file name or a file object as the argument. In your code img is probably None as you don't set it anywhere.

On another note, you shouldn't use a global variable for the image, or use global variables in general, if you're not sure you really need them. Refactor your code into a class that has the image as an attribute. Also, declaring photo as global in display is just plain unneccessary as you only use it in display anyways.

l4mpi
  • 5,103
  • 3
  • 34
  • 54
  • OK, but Im not sure how to fix it so it can works.. the whole 'global img' thing is something I got as it is and not supposed to change it. for example, I have this function in the code: def bnw(): ''''Converts the image to black and white''' global img img = img.convert(mode='L') display()' – user1816377 Jan 08 '13 at 13:53
  • 1
    Of course it works, it's just extremely bad design... To fix your `flip` function, remove the `open` call from it and make sure that what you pass into it is already an opened Image. This means you probably have to open the image once in the global scope if you don't do that already. – l4mpi Jan 08 '13 at 14:15