Почему в мире Tkinter ломается, используя canvas.create_image?
-
05-07-2019 - |
Вопрос
В работе у меня есть приложение с графическим интерфейсом Python, которое я собираюсь использовать как на 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: неизвестная опция " -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))))
Кто-нибудь может пролить свет?
Решение
Tk имеет два типа графики, растровое изображение и изображение. Изображения бывают двух видов, растровые и фото. Растровые изображения и изображения растрового типа - это не одно и то же, что приводит к путанице в документах. PhotoImage создает изображение типа photo и нуждается в объекте изображения на холсте, поэтому, как вы уже пришли к выводу, решение заключается в использовании create_image.
Другие советы
Краткий ответ: Не используйте create_bitmap, если вы хотите использовать create_image.
Метод create_bitmap ()
не имеет аргумента image
; у него есть bitmap
вместо этого.
Ошибка, которую вы получаете, связана с тем, что в Tkinter интерпретатор Tcl выполняется встроенным в процесс Python, и все взаимодействие с графическим интерфейсом происходит между Python и Tcl; Итак, ошибка, которую вы получаете, связана с тем, что Tcl отвечает "Я не знаю ни одного параметра -image в вызове .create_bitmap ".
В любом случае, как сказал Джефф, вам, вероятно, понадобится метод create_image
.