Почему в мире Tkinter ломается, используя canvas.create_image? - PullRequest
1 голос
/ 05 мая 2009

У меня есть приложение Python GUI, которое я собираюсь использовать как на Windows, так и на Mac. Документация по Tkinter не самая лучшая, и Google-фу подвел меня.

Короче я делаю:

c = Canvas(
    master=frame,
    width=settings.WINDOW_SIZE[0],
    height=settings.WINDOW_SIZE[1],
    background=settings.CANVAS_COLOUR
)
file = PhotoImage(file=os.path.join('path', 'to', 'gif'))
c.create_bitmap(position, image=file)
c.pack()
root.mainloop()

Если я закомментирую строку create_bitmap, приложение отрисовывается нормально. Если я прокомментирую его обратно, я получу следующую ошибку:

_tkinter.TclError: unknown option "-image"

Что странно. Tkinter в порядке, согласно тестам Python (т. Е. Импортирует _tkinter, Tkinter и делает Tk()). С тех пор я установил PIL против моей установки Windows (XP SP3, Python 2.6), представляя, что он выполняет некоторые тяжелые работы на низком уровне. Кажется, это не так; Я все еще получаю вышеупомянутую ошибку.

Полная трассировка стека, исключая уже вставленный код:

File "C:\Python26\lib\lib-tk\Tkinter.py", line 2153, in create_bitmap
return self._create('bitmap', args, kw)
File "C:\Python26\lib\lib-tk\Tkinter.py", line 2147, in _create
*(args + self._options(cnf, kw))))

Кто-нибудь способен пролить свет?

Ответы [ 3 ]

4 голосов
/ 05 мая 2009

Tk имеет два типа графики, растровое изображение и изображение. Изображения бывают двух видов, растровые и фото. Растровые изображения и изображения растрового типа не одно и то же, что приводит к путанице в документах. PhotoImage создает изображение типа photo и нуждается в объекте изображения на холсте, поэтому, как вы уже пришли к выводу, решение состоит в использовании create_image.

2 голосов
/ 05 мая 2009

Краткий ответ: Не используйте create_bitmap, если вы хотите использовать create_image.

0 голосов
/ 06 мая 2009

Метод create_bitmap() не имеет аргумента image; вместо этого он имеет аргумент bitmap.

Ошибка, которую вы получаете, связана с тем, что в Tkinter интерпретатор Tcl выполняется встроенным в процесс Python, и все взаимодействие с графическим интерфейсом происходит между Python и Tcl; Итак, ошибка, которую вы получаете, связана с тем, что Tcl отвечает: «Я не знаю ни одного параметра -image в вызове .create_bitmap».

В любом случае, как сказал Джефф, вам, вероятно, понадобится метод create_image.

...