在Python中使用Tkinter加载图像

问题描述 投票:0回答:1

我一定错过了一些东西,因为我的代码不起作用:

我在 类 compaClass 中有这两个函数:

def drawImgs(self):
    canvas1.delete("all")
    canvas1.create_image(0, 0, anchor=NW, image=newImg1)

def loadImg(self):
    global newImg1
    ...
    newImg1 = ImageTk.PhotoImage(resized_image1)

这件事很好,但我在想:为什么要在类外使用变量?为什么不使用 compaClass.img 变量呢?它应该始终可用,而无需将其声明为全局的。所以我用 self.img1 替换了 newImg 现在它不会绘制任何内容,不会返回任何错误 - 它看起来很像没有“global newImg1”的原始版本。

对我错过的它不起作用有什么建议吗?

def drawImgs(self):
    canvas1.delete("all")
    canvas1.create_image(0, 0, anchor=NW, image=self.img1)

def loadImg(self):
    global newImg1
    ...
    self.img1 = ImageTk.PhotoImage(resized_image1)
python tkinter canvas image.createimage
1个回答
0
投票

如果不存在对图像对象的引用,则使用

ImageTk.PhotoImage
创建并分配给函数或方法本地变量的图像将受到垃圾回收。

  1. 确保
    compaClass
    在需要时存储变量中。
  2. 在类的构造函数中
  3. 初始化
    self.img1
    并在loadImg()
    更新

修改后的代码:

import tkinter as tk
from tkinter import Canvas
from PIL import Image, ImageTk
class CompaClass:
    def __init__(self, root):
        self.root = root
        self.canvas = Canvas(root, width=400, height=400)
        self.canvas.pack()
        self.img1 = None
    def draw_imgs(self):
        self.canvas.delete("all")
        if self.img1:
            self.canvas.create_image(0, 0, anchor=tk.NW, image=self.img1)
        else:
            print("No image has been loaded")
    def load_img(self, image_path):
        image = Image.open(image_path)
        resized_image = image.resize((400, 400))
        self.img1 = ImageTk.PhotoImage(resized_image)
        self.draw_imgs()
root = tk.Tk() 
app = CompaClass(root)
app.load_img('your_path_to_the_image.jpg')
root.mainloop()
© www.soinside.com 2019 - 2024. All rights reserved.