簡體   English   中英

Tkinter-不顯示圖像

[英]Tkinter - Images is not display

我是Tkinter的新手。 我試圖在畫布上顯示兩個圖像,但無法顯示。 我試圖通過創建兩個不同的文件來實現這一目標。 一個將包含所有邏輯,另一個將處理gui。 到目前為止,這是我的代碼:

file1.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()

file2.py

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

class Display:

    def __init__(self, canv):
        self.canvas = canv


    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.canvas.create_image(400, 400, image=self.photo_image, anchor='center')

        self.canvas.create_rectangle(50, 25, 150, 75, fill="blue")

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

這里的問題是,我創建的兩個圖像項不會顯示在畫布上,而只會顯示在矩形上。 有人可以幫我弄這個嗎?

PS:我正在使用python v 3.4

問題是垃圾回收之一。 您的Display對象存儲在start_gui.__init__內的局部變量中。 構造start_gui ,將丟棄該對象。 圖像是該對象的屬性,因此會被垃圾回收。 當圖像對象被垃圾回收時,tkinter無法顯示它。

簡單的解決方案是保留對Display的永久引用:

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

另一個解決方案:我們可以使Display繼承自tk.Canvastk.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()

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM