Skip to main content
 首页 » 编程设计

python之当试图创建位图 : _tkinter. TclError: bitmap "pyimage2"not defined

2024年12月31日31zengkefu

有一张图片我想用不同的颜色绘制,所以我将它转换为位图,但是当尝试在 Canvas 上创建它时出现错误。

这是代码:

import PIL.Image 
from PIL import ImageTk 
from tkinter import * 
 
 
im = PIL.Image.open("lightbulb.gif") 
small_im = im.resize((20,20), resample=PIL.Image.NEAREST).convert('1'); 
 
root = Tk() 
canvas = Canvas(root,width=100,height=100,bg='black') 
canvas.pack() 
bitmap = ImageTk.BitmapImage(small_im) 
bitmap_id = canvas.create_bitmap(3,3,background='', foreground='gray', bitmap=bitmap, 
                                 anchor=NW) 
root.mainloop() 

我收到以下错误:

Traceback (most recent call last): 
  File "/Users/ronen/Dropbox/trycanvas/bitmaps.py", line 13, in <module> 
    bitmap_id = canvas.create_bitmap(3,3,background="", foreground="gray", bitmap=bitmap, anchor=NW) 
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tkinter/__init__.py", line 2486, in create_bitmap 
    return self._create('bitmap', args, kw) 
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tkinter/__init__.py", line 2480, in _create 
    *(args + self._options(cnf, kw)))) 
_tkinter.TclError: bitmap "pyimage2" not defined 

我做错了什么?

请您参考如下方法:

tkinter canvas.create_bitmap() 方法期望它的 bitmap= 选项是一个 string 包含 name 之一的标准位图(它们是 'error'、'gray75'、'gray50'、'gray25' , 'gray12', '沙漏', '信息', 'questhead', 'question', and 'warning') 看起来像这样:

或一个文件的路径名,其中包含您自己的文件,格式为.xbm,前缀为@ 字符。

下面是如何修改您的代码,以便将您要显示的图像保存在临时 .xbm 格式文件中,然后告诉 tkinter 使用该文件:

import os 
import PIL.Image 
from PIL import ImageTk 
from tempfile import NamedTemporaryFile 
import tkinter as tk 
 
im = PIL.Image.open("lightbulb.gif") 
small_img = im.resize((20,20), resample=PIL.Image.NEAREST).convert('1'); 
 
with NamedTemporaryFile(suffix='.xbm', delete=False) as temp_img: 
    small_img.save(temp_img.name) 
 
root = tk.Tk() 
canvas = tk.Canvas(root, width=100, height=100, bg='black') 
canvas.pack() 
bitmap_id = canvas.create_bitmap(3, 3, background='', foreground='gray', 
                                 bitmap='@'+temp_img.name, anchor=tk.NW) 
root.mainloop() 
 
try:  # Cleanup 
    os.remove(temp_img.name)  # Get rid of named temporary file. 
except FileNotFoundError: 
    pass