2016-07-31 23 views
1

fand ich diesen Code:Wie wird das Bild in Python richtig angezeigt?

from PIL import Image, ImageTk 
import tkinter as tk 

root = tk.Tk() 

img = Image.open(r"Sample.jpg") 
canvas = tk.Canvas(root, width=500, height=500) 
canvas.pack() 
tk_img = ImageTk.PhotoImage(img) 
canvas.create_image(250, 250, image=tk_img) 

root.mainloop() 

Es zeigt jedes Bild in 500x500px Auflösung. Ich habe versucht, es zu ändern und zeigt es in seiner Originalgröße:

from PIL import Image, ImageTk 
import tkinter as tk 

root = tk.Tk() 

img = Image.open(r"D:/1.jpg") 
canvas = tk.Canvas(root, width=img.width, height=img.height) 
canvas.pack() 
tk_img = ImageTk.PhotoImage(img) 
canvas.create_image(img.width/2, img.height/2, image=tk_img) 

root.mainloop() 

Aber etwas schief gelaufen ist und das Bild mit einer Größe von 604x604px zeigt in einem Fenster mit einer Größe von 602x602px, aber die Fenstergröße ist korrekt. Take a look(full image). Was mache ich falsch?

P.S. Entschuldige mein schlechtes Englisch.

Antwort

0

Nun, nein, Ihr erstes Beispiel schneidet immer noch um ein paar Pixel ab. Alle Top-Level-Fenster werden um ihre absoluten Grenzen herum gepolstert, um zu verhindern, dass andere Elemente in die Grenzen "bluten" und unprofessionell aussehen.

Sie erhalten immer noch eine Zeichenfläche von 604 Pixel mal 604 Pixel, aber das Stammfenster selbst setzt seine Auffüllung fest. Ich habe keine Möglichkeit gefunden, dieses Top-Level-Padding zu entfernen, und es kann sehr gut in anderen Betriebssystemen anders aussehen. Ein Problem könnte darin bestehen, eine Leinwandgröße anzufordern, die etwas größer ist als das Bild, das Sie anzeigen möchten.

Ein weiteres Problem, wenn Sie für Präzision Ziel sind, würde die Linie ...

canvas.create_image(img.width/2, img.height/2, image=tk_img) 

Welche Off-by-one Fehler, wenn Ihre Breite oder Höhe eine ungerade Zahl ist erstellen können. Sie können Bilder in der Nordwestecke verankern und legen sie an den Koordinaten (0, 0) wie solche:

canvas.create_image(0, 0, anchor=tk.NW, image=tk_img) 
+0

Der Screenshot in der Frage verbunden zeigt, dass Fensterrahmen sind nicht im Preis enthalten Größe, gibt es eine zusätzliche Leer Leerzeichen zwischen dem Fensterrand und dem Bild. –