2017-03-31 5 views
0

Ich bin neu auf Tkinter. Ich habe versucht, zwei Bilder auf meiner Leinwand zu zeigen, aber ich konnte nicht. Ich habe versucht, dies zu erreichen, indem ich zwei verschiedene Dateien erstellt habe. Einer wird alle Logik dahinter enthalten und der andere wird mit der GUI umgehen. Hier ist mein Code so weit:Tkinter - Bilder werden nicht angezeigt

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') 

Das Problem hierbei ist, dass die beiden Bilder Gegenstände, die ich erstellt zeige nicht auf der Leinwand, sondern nur das Rechteck. Kann mir jemand dabei helfen?

PS: Ich verwende Python v 3.4

+0

GIF-Bild ist in der gleiche Ordner – JOrG

Antwort

0

Eine andere Lösung: Wir Display vererben Klasse machen können 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

Das Problem ist einer der Garbage Collection. Ihr Objekt Display wird in einer lokalen Variablen innerhalb start_gui.__init__ gespeichert. Sobald start_gui konstruiert ist, wird dieses Objekt weggeworfen. Das Bild ist ein Attribut dieses Objekts, so dass es Müll gesammelt wird. Wenn ein Bildobjekt eine Sammlung von Datenmüll erhält, kann tkinter es nicht anzeigen.

Die einfache Lösung ist ein permanenten Verweis auf Display zu halten:

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