Python Numpy矩阵到tkinter画布

Python Numpy矩阵到tkinter画布,python,numpy,canvas,tkinter,tkinter-canvas,Python,Numpy,Canvas,Tkinter,Tkinter Canvas,如何将Numpy矩阵作为位图显示到Tkinter画布中? 更准确地说,如何用矩阵中的内容填充照片图像 photo = ImageTk.PhotoImage(...) self.canvas.create_image(0,0,image=photo,anchor=Tkinter.NW) 这是一个可行的解决方案,稍作修改以使其可行(某些功能已被弃用),并简化它以仅保留必要的部分。我们必须使用Image.frombytes(…)读取numpy矩阵中的数据 import Tkinter from PI

如何将Numpy矩阵作为位图显示到Tkinter画布中? 更准确地说,如何用矩阵中的内容填充
照片图像

photo = ImageTk.PhotoImage(...)
self.canvas.create_image(0,0,image=photo,anchor=Tkinter.NW)
这是一个可行的解决方案,稍作修改以使其可行(某些功能已被弃用),并简化它以仅保留必要的部分。我们必须使用
Image.frombytes(…)
读取numpy矩阵中的数据

import Tkinter
from PIL import Image, ImageTk
import numpy

class mainWindow():
    def __init__(self):
        self.root = Tkinter.Tk()
        self.frame = Tkinter.Frame(self.root, width=500, height=400)
        self.frame.pack()
        self.canvas = Tkinter.Canvas(self.frame, width=500,height=400)
        self.canvas.place(x=-2,y=-2)
        data=numpy.array(numpy.random.random((400,500))*100,dtype=int)
        self.im=Image.frombytes('L', (data.shape[1],data.shape[0]), data.astype('b').tostring())
        self.photo = ImageTk.PhotoImage(image=self.im)
        self.canvas.create_image(0,0,image=self.photo,anchor=Tkinter.NW)
        self.root.update()
        self.root.mainloop()

mainWindow()

使用im=Image.fromarray(data)@Basj,你可以更快地到达那里。什么问题的答案?毫无疑问。但似乎没有必要将ndarray转换为字符串并返回。相关:然后将
self.im=Image.frombytes('L',(data.shape[1],data.shape[0]),data.astype('b').tostring())
替换为
self.im=Image.fromarray(data)
Oh,这样你就不需要
im
成为
self
的成员了。保留对
photo
的引用是唯一重要的部分,因为它可能会被垃圾收集。此外,将这些引用存储到例如
self.canvas中似乎是一种标准做法。_foo
你的剪贴确实帮助了我。@nitzel可以用你的命题修改答案,或者发布另一个答案。我真的认为有两个版本很有帮助,所以我们可以比较,等等。谢谢。如果您希望替代的低级别解决方案不依赖于外部模块(如ImageTk),请参阅