при попытке создать растровое изображение: _tkinter.TclError: растровое изображение "pyimage2" не определено - PullRequest
0 голосов
/ 29 октября 2018

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

Это код:

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

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Хорошо, теперь я понимаю, что происходит. ImageTk.BitmapImage на самом деле возвращает изображение, а не растровое изображение, но его можно использовать для изменения цветов. Итак, intead of:

bitmap = ImageTk.BitmapImage(small_im)
bitmap_id = canvas.create_bitmap(3,3,background='', foreground='gray', bitmap=bitmap,
                                 anchor=NW)

Я должен был закодировать:

from_bitmap = ImageTk.BitmapImage(small_im, background='', foreground='gray')
bitmap_id = canvas.create_image(3,3, image=from_bitmap, anchor=NW)
0 голосов
/ 29 октября 2018

Метод tkinter canvas.create_bitmap() ожидает, что его опция bitmap= будет строкой , содержащей либо имя одного из стандартных растровых изображений (которые 'error', * 1008) *, 'gray50', 'gray25', 'gray12', 'hourglass', 'info', 'questhead', 'question' и 'warning') и которые выглядят следующим образом:

image showing the standard bitmaps graphically

Или путь к файлу с вашим собственным файлом в формате .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
...