微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Canvas 的图像未创建

如何解决Canvas 的图像未创建

所以我想要一个在点击后更新显示图片的窗口。 只要没有进一步的 tk.Tk() 实例(删除/添加下面代码的第 8 行),它就可以正常工作。

如果之前创建过,则会引发此错误

line 29,in CreatePeakSelectionWindow
[...]
self.imgCanvas.create_image((0,0),anchor=tk.NW,image=self.img1)
[...]
_tkinter.TclError: image "pyimage1" doesn't exist

我想我需要向 Tk() 传递一些参数? 我什至不知道去哪里解决这个问题并了解它是如何引起的。 遗憾的是,这个小部件用于允许手动选择一些峰值,应该在外部窗口中完成。 仅供参考,为简单起见,所有数组都是虚拟的(随机数组)。

非常感谢您的帮助!

导致问题的代码如下:

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

class Dummy:
    def __init__(self):
        self.MainWin = tk.Tk() #>this line causes the issue
        imgs = np.random.randint(0,255,(512,624,2))
        self.img = imgs[:,:,0] #self.img is a numpy array in black and white
        self.imgSize = self.img.shape
        self.peakList = np.array([[200,200],[300,400]])
        self.selectedindexOfPeaksList = []
        self.peakListGenerated = True

    def CreatePeakSelectionWindow(self):
        if self.peakListGenerated:
            self.selectedindexOfPeaksList = []
            self.PeakSelectionWindow = tk.Tk()
            self.PeakSelectionWindow.protocol("WM_DELETE_WINDOW",self.PeakSelectionWindowClose)
            self.PeakSelectionWindow.geometry("%sx%s"%(self.imgSize[1],self.imgSize[0]))
            self.PeakSelectionWindow.title("Peak Slection")
            self.img1 = ImageTk.PhotoImage(image=Image.fromarray(self.img))
            self.imgCanvas = tk.Canvas(self.PeakSelectionWindow,width=self.imgSize[1],height=self.imgSize[0])
            self.imgCanvas.place(x=0,y=0)
            self.PeakSelectionWindow.bind("<Button 1>",self.LeftClick)
            self.PeakSelectionWindow.bind("<Button 3>",self.RightClick)
            self.PeakSelectionWindow.update()
            self.imgCanvas.create_image((0,image=self.img1)
        else:
            print("List of peaks has not yet been generated!",file=sys.stderr)

    def PeakSelectionWindowClose (self):
        if len(self.selectedindexOfPeaksList) > 0:
            print("put extraction here")
            #self.selectedPeaksEntry.insert(tk.END,",".join(map(str,self.selectedindexOfPeaksList)))
        self.PeakSelectionWindow.destroy()

    def LeftClick(self,event):
        distance = np.sqrt((self.peakList[:,1]-event.x)**2+(self.peakList[:,0]-event.y)**2)
        index = np.argmin(distance)
        if index not in self.selectedindexOfPeaksList:
            self.peakList[index]
            self.selectedindexOfPeaksList += [index]
            newImg = np.random.randint(0,(self.img.shape[0],self.img.shape[1],3))
            self.PeakSelectionWindow.newImg = img = ImageTk.PhotoImage(image=Image.fromarray(newImg.astype("uint8"),mode="RGB"))
            self.imgCanvas.delete("all")
            self.imgCanvas.create_image((0,image=self.PeakSelectionWindow.newImg)
            self.imgCanvas.update()

    def RightClick (self,0]-event.y)**2)
        index = np.argmin(distance)
        print(self.selectedindexOfPeaksList)
        if index in self.selectedindexOfPeaksList:
            if len(self.selectedindexOfPeaksList) > 1:
                self.selectedindexOfPeaksList.remove(index)
                newImg = np.random.randint(0,3))
                self.PeakSelectionWindow.newImg = img = ImageTk.PhotoImage(image=Image.fromarray(newImg.astype("uint8"),mode="RGB"))
                self.imgCanvas.delete("all")
                self.imgCanvas.create_image((0,image=self.PeakSelectionWindow.newImg)
                self.imgCanvas.update()
            else:
                self.selectedindexOfPeaksList = []
                self.PeakSelectionWindow.newImg = newImg = ImageTk.PhotoImage(image=Image.fromarray(self.img.astype("uint8")))
                self.imgCanvas.delete("all")
                self.imgCanvas.create_image((0,image=self.PeakSelectionWindow.newImg)
                self.imgCanvas.update()




if __name__ == "__main__":
    window = Dummy()
    window.CreatePeakSelectionWindow()
    tk.mainloop()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。