2017-03-31 113 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)