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 (将#修改为@)