2017-03-31 36 views
0

私はTkinterで新しいです。私はキャンバスに2枚の画像を表示しようとしていましたが、できませんでした。私は2つの異なるファイルを作成してこれを達成しようとしました。 1つはすべてのロジックを含み、もう1つは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') 

ここでの問題は、私が作成した2つの画像の項目がキャンバスに表示されないということですが、矩形のみ。誰かがこれで私を助けることができますか?

PS:私はPythonのV 3.4

+0

からDisplay継承を作ることができるです同じフォルダ – JOrG

答えて

0

別の解決策:私たちは、イメージの.gifクラス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) 
関連する問題