image resize doesn't work

Chris Hare chare at labr.net
Sun Aug 1 15:08:44 EDT 2010


On Aug 1, 2010, at 1:08 PM, Peter Otten wrote:

> Chris Hare wrote:
> 
> 
>> On Aug 1, 2010, at 10:24 AM, rantingrick wrote:
>> 
>>> On Aug 1, 7:35 am, Chris Hare <ch... at labr.net> wrote:
>>>> I have the following chunk of code.  Although it seems to execute fine,
>>>> no errors
>>> 
>>> Not True! it contains syntax errors. Check the posted code and next
>>> time post all the code.
>>> --
>>> http://mail.python.org/mailman/listinfo/python-list
>> 
>> Hmmm... ok
>> here is the code.  I get no errors on my console when it execute
>> 
>> urllib.urlretrieve(findu, "image.png")
> 
> I get a NameError on the very first line.
> 
>>>> urllib.urlretrieve(findu, "image.png")
> Traceback (most recent call last):
>  File "<stdin>", line 1, in <module>
> NameError: name 'urllib' is not defined
> 
> When you want to demonstrate a problem try to make a self-contained example, 
> i. e. one that can be run without the need for us guess the surrounding 
> code. Remove everything that is irrelevant for the problem like the logging 
> in code below and the png/gif conversion gymnastics.
> 
> Anyway, here is a self-contained demo (you have to pass the filename of an 
> image on the commandline):
> 
> import Tkinter
> import ImageTk
> import Image
> import sys
> 
> [filename] = sys.argv[1:]
> 
> image = Image.open(filename)
> 
> root = Tkinter.Tk()
> frame = Tkinter.Frame(root)
> frame.pack()
> label = Tkinter.Label(root)
> label.pack()
> 
> def make_resize(percent):
>    def resize():
>        width, height = image.size
>        label.image = label["image"] = ImageTk.PhotoImage(
>            image=image.resize((width*percent//100, height*percent//100)))
>    return resize
> 
> make_resize(100)()
> 
> pairs = [
>    ("Small", 20),
>    ("Medium", 50),
>    ("Original", 100),
>    ("Big", 200)]
> 
> for i, (text, percent) in enumerate(pairs):
>    button = Tkinter.Button(frame, text=text, command=make_resize(percent))
>    button.grid(row=0, column=i)
> 
> root.mainloop()
> 
> Peter
> -- 
> http://mail.python.org/mailman/listinfo/python-list

Thanks for the help.  My one week of python is getting a workout.

I have shortened it all down and made it a standalone example, using yours as a model.  Your example, works, but it will take a lot of effort to retrofit it into the code I have.  (which is maybe not a bad idea,).

Anyway

from Tkinter import *
import ImageTk
import Image
import sys

def sizeit(filename):
	image = Image.open(filename)
	w,h = image.size
	print w, h
	photo = ImageTk.PhotoImage(file=filename)
	canvasWidth = 450
	canvasHeight = 412
	image = image.resize((canvasWidth,canvasHeight),Image.ANTIALIAS)
	w,h = image.size
	print w, h
	netRadarImage = Label(frame, image=image)
	netRadarImage.image = photo
	w.grid(row=1, column=0, columnspan=3)
	netRadarImage.grid( row=1, column=0)

[filename] = sys.argv[1:]

root = Tk()
frame = Frame(root)
frame.grid()
sizeit(filename)

root.mainloop()

Just like yours it takes a filename.  Unlike yours, mine gets an error that I can't figure out and is likely the root of the problem.  

When I run this code I get

600 550 <== ORIGINAL image size
450 412 <== resized image size
Traceback (most recent call last):
  File "zztest.py", line 26, in <module>
    sizeit(filename)
  File "zztest.py", line 16, in sizeit
    netRadarImage = Label(frame, image=image)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-tk/Tkinter.py", line 2466, in __init__
    Widget.__init__(self, master, 'label', cnf, kw)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-tk/Tkinter.py", line 1932, in __init__
    (widgetName, self._w) + extra + self._options(cnf))
_tkinter.TclError: image "<Image.Image image mode=P size=450x412 at 0x1016095A8>" doesn't exist

So, my problem appeared to be the resize, but in fact is just getting it onto the label.

What am I doing wrong?






More information about the Python-list mailing list