Tkinter图像不显示

2024-04-20 08:55:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我是新来的。我试图在画布上显示两个图像,但我做不到,我试图通过创建两个不同的文件来实现这一点。一个将包含后面的所有逻辑,另一个将处理gui。以下是我目前为止的代码:

文件1.py

from file2 import *

import tkinter as tk

import random

# global variables
w = 'initial'

class start_gui(tk.Frame):

    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self,parent, *args, **kwargs)
        # create canvas
        self.canvas = tk.Canvas(parent, width=800, height=800, background="green")
        self.canvas.pack()

        c = Display(self.canvas)
        c.current_play(w)

    if __name__ == "__main__":
      # create main window
      root = tk.Tk()
      root.geometry("800x800")
      start_gui(root)
      root.mainloop()

文件2.py

^{pr2}$

这里的问题是,我创建的两个图像项没有显示在画布上,而只显示在矩形上。有人能帮我吗?在

PS:我使用的是pythonv3.4


Tags: 文件py图像importselfinit画布args
2条回答

问题是垃圾收集。您的Display对象存储在start_gui.__init__内的局部变量中。一旦start_gui被构造,这个对象就会被丢弃。图像是该对象的一个属性,因此它被垃圾回收。当图像对象被垃圾回收时,tkinter无法显示它。在

简单的解决方案是保留对Display的永久引用:

self.display = Display(canvas)
self.display.current_play(w)

另一个解决方案:我们可以使Display从类tk.Canvas继承

import tkinter as tk
from PIL import ImageTk
from PIL import Image

import random

# global variables
w = 'initial'

class Display(tk.Canvas):
    def __init__(self,  parent, *args, **kwargs):
        tk.Canvas.__init__(self, parent, *args, **kwargs)


    def current_play(self, option):
        if option == 'initial':
            self.initial_display()
        elif option == 'n' or option == 's':
            self.ns_display()

    def initial_display(self):
        # display cat image
        self.im = Image.open("cat.gif")
        self.photo_image = ImageTk.PhotoImage(self.im)
        self.demo = self.create_image(400, 400, image=self.photo_image, anchor='center')
        self.create_rectangle(50, 25, 150, 75, fill="blue")

        self.temp_image = tk.PhotoImage(file="cat.gif")
        self.demo2 = self.create_image(600, 600, image = self.temp_image, anchor='center')


class start_gui(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self,parent, *args, **kwargs)
        # create canvas
        self.canvas = Display(parent, width=800, height=800, background="green")
        self.canvas.pack()
        self.canvas.current_play(w)

if __name__ == "__main__":
    root = tk.Tk()
    root.geometry("800x800")
    start_gui(root)
    root.mainloop()

enter image description here

相关问题 更多 >