存储在RAM中的PIL.ImageTk.PhotoImage在Tkinter上显示为黑色正方形

2024-10-01 15:38:31 发布

您现在位置:Python中文网/ 问答频道 /正文

好的,我正试图用Python复制一个光线投射器。所有事情都完成了,现在我有一个512x512矩阵编码为8位颜色,我尝试通过Tkinter渲染

问题是,在用枕头做了一点转换后,图像看起来大约只有原来的一半大小,但最重要的是它是一个黑色的正方形。我肯定这是对函数的某种误用,但我找不到是哪一种。代码如下:

from PIL import Image, ImageTk
import tkinter as Tk
import matplotlib.pyplot as plt, numpy as np

fen = Tk.Tk()
img = plt.imread('BG0.png')
canvas = Tk.Canvas(fen, width = 512, height = 512)
canvas.pack()

def Up(event):
   global img
   i = np.finfo(img.dtype)
   img = img.astype(np.float64)/i.max
   img = 255 * img
   img = img.astype(np.uint8)
   img = ImageTk.PhotoImage(Image.fromarray(img))
   canvas.create_image(0, 0, image = img, anchor = Tk.NW)

fen.bind_all('<Up>', Up)
fen.mainloop()

这是我们想要展示的著名图像(但实际上,任何512x512图像都可以做到这一点),只需将其放在与此程序相同的文件夹中即可: BG0.png

只需按键盘上的向上箭头键,即可在tkinter窗口中进行渲染


Tags: 图像imageimportimgpngtkinterasnp
1条回答
网友
1楼 · 发布于 2024-10-01 15:38:31

这是一个PIL和Tkinter的错误

ImageTk返回的图像必须存储在变量或列表中

您可以尝试从列表中弹出一个图像,它将消失

这是你能做的

from PIL import Image, ImageTk
import tkinter as Tk
import matplotlib.pyplot as plt, numpy as np

fen = Tk.Tk()
img = plt.imread('BG0.png')
canvas = Tk.Canvas(fen, width = 512, height = 512)
canvas.pack()

# THIS IS NEEDED
images_tk_list = []
 
def Up(event):
   global img
   i = np.finfo(img.dtype)
   img = img.astype(np.float64)/i.max
   img = 255 * img
   img = img.astype(np.uint8)
   img = ImageTk.PhotoImage(Image.fromarray(img))

   # THIS IS NEEDED
   images_tk_list.append( img )

   canvas.create_image(0, 0, image = img, anchor = Tk.NW)

fen.bind_all('<Up>', Up)
fen.mainloop()

相关问题 更多 >

    热门问题