为什么Tkinter使用canvas.create_image会崩溃?

1 投票
3 回答
2501 浏览
提问于 2025-04-15 11:24

我正在开发一个Python的图形界面应用,打算在Windows和Mac上都能用。关于Tkinter的文档不是很好,而且我在网上搜索也没有找到有用的信息。

简单来说,我在做的是:

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"

这就很奇怪了。根据Python的测试(也就是导入_tkinter、Tkinter,然后调用Tk()),Tkinter是没问题的。我还在我的Windows系统(XP SP3,Python 2.6)上安装了PIL,以为它能在底层帮忙处理一些事情。但看起来并没有;我还是遇到了之前提到的错误。

完整的错误追踪信息,除了我已经贴出的代码,是:

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 个回答

0

这个 create_bitmap() 方法并没有一个叫 image 的参数;它实际上有一个叫 bitmap 的参数。

你遇到的错误是因为在 Tkinter 中,有一个 Tcl 解释器嵌入在 Python 进程里,所有的图形界面互动都是在 Python 和 Tcl 之间来回进行的。所以,你看到的错误是因为 Tcl 回应说:“我不知道 .create_bitmap 调用中有什么 -image 选项”。

总之,就像 Jeff 说的,你可能想用 create_image 方法。

2

简单来说:当你想用 create_image 的时候,不要用 create_bitmap。

4

Tk有两种图形类型,分别是位图和图像。图像又分为两种,位图和照片。位图和类型为位图的图像并不是一回事,这常常让人感到困惑。

PhotoImage是用来创建照片类型的图像,它需要在画布上有一个图像对象。所以,解决方法就是你已经想到的,使用create_image。

撰写回答