0
import tkinter as tk 

from PIL import Image, ImageTk 

class ImageViewer(tk.Tk): 
    def __init__(self): 
     tk.Tk.__init__(self) 

     self.screen_width = self.winfo_screenwidth() 
     self.screen_height = self.winfo_screenheight() 

     self.geometry("%dx%d%+d%+d" % (self.screen_width, 
         self.screen_height, 0, 0)) 

Putting Bild auf weißen HintergrundWarum brauche ich Klassenmitglied, um ein Bild auf Canvas anzuzeigen?

 self.canvas = tk.Canvas(self, bg='white') 

     self.canvas.config(height=self.screen_height, 
       width=self.screen_height, highlightthickness=0) 
     self.canvas.pack() 

Wenn ich versuche, Variable zu verwenden image_tk statt self.Image_tk es nicht Bild ist zeigen

def show_image(self): 
     image = Image.open("./image1.jpg") 

     image_width, image_height = image.size 

     window_width = int(self.canvas['width']) 
     window_height = int(self.canvas['height']) 
     window_centre_x = window_width/2 
     window_centre_y = window_height/2 

     if image_width > window_width or image_height > window_height: 

      image.thumbnail((window_width, window_height), 
       Image.ANTIALIAS) 
      self.image_tk = ImageTk.PhotoImage(image) 
      self.canvas.create_image(window_centre_x, window_centre_y, 
       image=self.image_tk, anchor=tk.CENTER, tag='i') 
     else: 
      scale_x = float(window_width)/image_width 
      scale_y = float(window_height)/image_height 

      if scale_x > scale_y: 
       scale = scale_y 
      else: 
       scale = scale_x 

      scaled_width = int(image_width * scale) 
      scaled_height = int(image_height * scale) 

      image = image.resize((scaled_width, scaled_height), 
          Image.ANTIALIAS) 
      self.image_tk = ImageTk.PhotoImage(image) 
      self.canvas.create_image(window_centre_x, window_centre_y, 
       image=self.image_tk, anchor=tk.CENTER, tag='i') 

img = ImageViewer() 
img.show_image() 
img.mainloop() 
+0

Ich bin sehr neu in Python, also bitte nicht meine Codierung Stil – codetolive

Antwort

1

Normalerweise, wenn Sie verwenden einfach image_tk darauf s eigene Python wird es in Garbage Collection abfangen und entfernen. Um dies zu verhindern, d. H. Das Bild tatsächlich anzeigen zu lassen, müssen Sie es an etwas Dauerhaftes binden, das nicht in der Speicherbereinigung gefangen ist. Eine der Möglichkeiten, dies zu tun, ist innerhalb einer Klasse, indem Sie auf self verweisen.

Es ist also nicht die tatsächliche Klasse, die das Bild anzeigen kann, sondern die Tatsache, dass, wenn es in Ihrer Klasse an self angefügt ist, es von Python nicht gelöscht wird und daher angezeigt wird.

+0

Das macht Sinn. Wenn ich also nicht falsch liege, sollte alles, was auf der Leinwand gezeigt wird, an sich selbst gebunden sein? – codetolive

+1

@codetolive Es sind nur Bilder, die auf diese Weise Garbage gesammelt bekommen, andere Canvas-Objekte (Ovale, Rechtecke, Polygone ...) müssen nicht an sich selbst angehängt werden, um sichtbar zu sein. – SneakyTurtle

+0

vielen Dank @SneakyTurtle – codetolive

Verwandte Themen