Холст Tkinter не отображается - PullRequest
3 голосов
/ 08 февраля 2010

Я пытаюсь выучить немного Python и Tkinter. Приведенный ниже пример кода предназначен для размещения на экране двух окон, нескольких кнопок и холста с изображением и нарисованными на нем линиями.

Окна и кнопки выглядят просто отлично, однако я не вижу ни изображения холста, ни линий холста. Буду признателен за помощь в выяснении того, что нужно для отображения моего холста.

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()

Ответы [ 2 ]

5 голосов
/ 27 октября 2010

Я решил эту проблему:

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

Ссылка на экземпляр ImageTk должна храниться где-нибудь, или, когда ваш метод App.__init__() вернется, он будет собирать мусор и холст не сможет его отобразить. (Tkinter не сохраняет ссылку на изображение.)

Один из способов сохранить ссылку на нее - сохранить ее в «self.photo», или в переменной с именем «photo», или, как это делают большинство программистов для константных переменных (переменных, которые не меняются, например, «TEN» = 10 '),' PHOTO = PhotoImage (...) 'Почему ... я понятия не имею. Импорт модуля 'gc' (встроенный модуль сборки мусора в Python 3) и запуск gc.disable () не работают. (Если вы хотите попробовать это: https://docs.python.org/3/library/gc.html)

3 голосов
/ 08 февраля 2010

Вам необходимо использовать круглые скобки при вызове pack для объекта canvas. В противном случае вы просто ссылаетесь на объект функции, а не вызываете его.

Например:

canvas.pack()

Другой пример:

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

>>>hello возвращает ссылку на функцию (функция hello при 0x ....)

>>>hello() фактически вызывает функцию hello

...