PLEASE HELP--Button images refuse to show.

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Fri Apr 23 05:09:46 CEST 2010


En Mon, 19 Apr 2010 12:58:16 -0300, Barrett <barrett.n.b at gmail.com>  
escribió:

> I have been fighting the same bug for weeks now with zero success: I
> am trying to get images to come up on my buttons, but they are way too
> small. Regardless of whether I used my old Python 2.5.1 or now 2.6.5,
> the following code:
>
> [... too much code ...]
>
> Results in the following:
>
> http://img194.yfrog.com/img194/237/weirdness3.jpg
>
> ("3" and above, I have not coded the pix for. I want to get the "1"
> and "2" right before proceeding.)
>
> I am completely at wit's end. I have tried using PIL, I have tried
> resizing the buttons, and zooming the images, and saving the images
> as .gif's and .jpeg's and .bmp's and you name it. Absolutely nothing
> is working. I have a major assignment due TOMORROW and absolutely MUST
> figure this out. Someone please show me what the heck I am doing wrong
> and what I can do to fix it.

I'm afraid this is coming late for your assignment then. For the next time:

- Try to isolate the problem. Start with your current, full program, and  
strip down sections (one at a time) and see whether the problem is still  
present or not. Eventually, you'll get working code (so you know the last  
removed section was the culprit) or it becomes so small that you cannot  
simplify it further.
(You posted a very long program, most of it irrelevant for this question)

- Explain how to reproduce the problem, what you got, and what you  
expected to get. (You posted what you got, but not what you expected. I  
had to *imagine* that those funny squares were supposed to contain an  
image).

This is a heavily stripped down version of your program that still shows  
the problem:

<code>
import Tkinter

def callback():
     b['image'] = image
     b['text'] = ''

root = Tkinter.Tk()
image = Tkinter.PhotoImage(file="1.gif")
b = Tkinter.Button(root, width=3, height=2, command=callback)
b['text'] = 'X'
b.pack()
root.mainloop()
</code>

If you remove the 'width' and 'height' specifications, it works fine. Now  
look at the documentation, from http://effbot.org/tkinterbook/button.htm :

"height= The height of the button. If the button displays text, the size  
is given in text units. If the button displays an image, the size is given  
in pixels (or screen units). If the size is omitted, it is calculated  
based on the button contents. (height/Height)

width= The width of the button. If the button displays text, the size is  
given in text units. If the button displays an image, the size is given in  
pixels (or screen units). If the size is omitted, or zero, it is  
calculated based on the button contents. (width/Width)"

Initially the button contains text, so width=3 and height=2 are in  
character units. When you set an image, the same values are interpreted in  
pixels instead.

Replace the callback function with this one, or some variant:

def callback():
     b.config(image=image, text='',
              width=image.width(),
              height=image.height())

(btw, notice usage of config() to set widget attributes, and implicit line  
continuation instead of \ )

-- 
Gabriel Genellina




More information about the Python-list mailing list