简体   繁体   English

_tkinter.TclError:图像“...”不存在 _ImageGrab.grab()

[英]_tkinter.TclError: image “…” doesn't exist _ ImageGrab.grab()

Summary of code purpose: change tk.Button['image'] to either selected file, or screen snip代码目的摘要:将 tk.Button['image'] 更改为选定文件或屏幕截图

I'm getting this error:我收到此错误:

_tkinter.TclError: image "<PIL.Image.Image image mode=RGB size=600x400 at 0x34045F0>" doesn't exist

But I can't understand why it doesn't exist since if I use print(self.image_selected) I get但我不明白为什么它不存在,因为如果我使用print(self.image_selected)我得到

<PIL.Image.Image image mode=RGB size=600x400 at 0x3D16650>

Does it need to be a global variable?它需要是一个全局变量吗? Doesn't adding self take care of that?添加self不会解决这个问题吗?

CODE代码

import tkinter as tk
from tkinter import filedialog
from PIL import ImageGrab, ImageTk

class MCVE():
    def __init__(self, master):
        self.master = master
        self.ButtonOne = tk.Button(text="start",width=30,height=30,command = lambda: self.GetImg(master))
        self.ButtonOne.pack()
        self.image_selected = None
    def GetImg(self, master):
        self.newWin = tk.Toplevel(self.master)
        self.ButtonTwo = tk.Button(self.newWin,text="snip", command = lambda: self.Snip(self.master))
        self.ButtonThree = tk.Button(self.newWin, text="open", command = lambda: self.FileO(self.master))
        self.ButtonTwo.pack()
        self.ButtonThree.pack()
    def Snip(self, master):
        self.image_selected = ImageGrab.grab(bbox=(0,0,600,400))
        self.changeImg()
    def FileO(self, master):
        ret = filedialog.askopenfilename()  # filedialog.askopenfilename(initialdir='/home/user/images/')
        if ret:
            self.image_selected = ImageTk.PhotoImage(file=ret)
        self.changeImg()
    def changeImg(self):
        if self.image_selected:
            print(self.image_selected)
            #self.ButtonOne['image'] = self.image_selected
            self.ButtonOne.config(image=self.image_selected)


def main():
    root = tk.Tk()
    MCVE(root)
    root.mainloop()


if __name__ == '__main__':
    main()

I tested the program, and as you stated, the 'snip' button gave me the error.我测试了程序,正如你所说,“snip”按钮给了我错误。 I could fix it by changing the format of the image to a ImageTk.PhotoImage .我可以通过将图像格式更改为ImageTk.PhotoImage来修复它。

    def Snip(self, master):
        self.image_selected = ImageTk.PhotoImage(ImageGrab.grab(bbox=(0,0,600,400)))
        self.changeImg()

I have to say, though, that the photo showed on the button icon after selecting the image was weird, but I guess it was because i tested it with the wrong resolution;不过,我不得不说,选择图像后按钮图标上显示的照片很奇怪,但我想这是因为我用错误的分辨率测试它; ;) ;)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM