2017-03-31 111 views
0

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

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

+0

.gif注意圖像是相同的文件夾 – JOrG

回答

0

另一種解決方案:我們可以從類使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

0

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

簡單的解決辦法是保持一個永久的參考Display

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