views:

297

answers:

2

I'm attempting to learn some Python and Tkinter. The sample code below is intended to put two windows on the screen, a few buttons, and a Canvas with an image in it and some lines drawn on it.

The windows and buttons appear just fine, however I'm not seeing either the canvas image or canvas lines. I'd appreciate some help to figure out what's need to make my canvas display.

from Tkinter import *
import Image, ImageTk

class App:

    def __init__(self, master):

    def scrollWheelClicked(event):
        print "Wheel wheeled"

    frame = Frame(master)
    frame.pack()
    self.button = Button(frame, text = "QUIT", fg="red", command=frame.quit)
    self.button.pack(side=LEFT)

    self.hi_there = Button(frame, text="Hello", command=self.say_hi)
    self.hi_there.pack(side=LEFT)

    top = Toplevel()
    canvas = Canvas(master=top, width=600, height=600)

    image = Image.open("c:\lena.jpg")
    photo = ImageTk.PhotoImage(image)
    item = canvas.create_image(0, 0, image=photo)

    canvas.create_line(0, 0, 200, 100)
    canvas.create_line(0, 100, 200, 0, fill="red", dash=(4, 4))
    canvas.create_rectangle(50, 25, 150, 75, fill="blue")

    canvas.pack

    testBtn = Button(top, text = "test button")
    testBtn.pack()

def say_hi(self):
    print "hi there everyone!"

root = Tk()
app = App(root)
root.mainloop()
A: 

You might need parenthesis when calling pack on the canvas object. Otherwise, you're just referring to the function object, not calling it.

For example:

canvas.pack()

Another example:

>>>def hello():
...    print "hello world"
...    return

>>>hello returns the function reference (function hello at 0x....)

>>>hello() actually calls the hello function

Brian
ah hah! That got the two lines and rectangle to dislay, however, the image is still not visible.
SooDesuNe
Might you be drawing the rectangle over the image (stack-wise), since it has a fill? According to the docs (http://effbot.org/tkinterbook/canvas.htm), "new items are drawn on top of old ones"
Brian
A: 

I solve this problem:

self.photo = ImageTk.PhotoImage(image)
self.item = canvas.create_image(0, 0, image=self.photo)

As you see your object photo must be a field of your class.


ps: sorry for my english ;)

Yauhen