2016-05-04 8 views
1

Ich habe diesen Code.Python Tkinter besetzen Bild gleichermaßen zu anderen Widget

class App(object): 
    def __init__(self): 
     self.root = Tk() 
     self.root.attributes('-zoomed', True) 
     self.root.grid_rowconfigure(0, weight=1) 
     self.root.grid_columnconfigure(0, weight=1) 
     self.root.grid_columnconfigure(1, weight=1) 

     f1 = Frame(self.root, bd=1, bg="green") 
     f3 = Frame(self.root, bd=1, bg="blue") 

     self.image = Image.open("default.png") 
     self.photo = ImageTk.PhotoImage(self.image) 
     self.label = Label(image=self.photo) 
     self.label.grid(row=0, column=1, sticky="nsew") 

     f1.grid(row=0, column=0, sticky="nsew") 
     f3.grid(row=1, column=0, columnspan=2, sticky="ew") 

app = App() 
app.root.mainloop() 

und der Ausgang ist enter image description here

Wie kann ich Bild besetzt gleichmäßig auf den linken Rahmen zu machen?

+0

Aber das Bild schon gleich nach links (grün) Rahmen positioniert, so was ist dein Problem? –

+0

das Problem ist, ich möchte die grüne Breite und die Bildbreite gleich. –

Antwort

0

Bevor eine Lösung bereitstellt, gibt es nur wenige Bemerkungen, die ich hervorheben möchte:

  1. Sie waren zwar nicht im Rahmen f3 für alles. Es wird nicht einmal angezeigt, wenn Sie Ihr Programm ausführen. Also werde ich es einfach in meiner Lösung unten ignorieren.
  2. Sie setzen das Attribut -zoomed für den Hauptrahmen 'attributes. Ich weiß nicht, welches Ziel Sie erfüllen werden, indem Sie es verwenden. Wie auch immer, es gibt viele Threads, die behaupten, dass nur Windows und einige Debian-Distributionen wie Ubuntu funktionieren. Ich habe dieses Problem jedoch nicht, aber wie Sie auf dem ersten Link lesen können, den ich unten zur Verfügung stelle, sind diese Argumente plattformspezifisch. Aus Gründen der Portabilität Ihres Codes können Sie stattdessen -fullscreen verwenden. Aber auch hier, speziell für Ihren Fall, wird es sogar die Taskleiste Ihrer GUI beeinflussen, die nicht angezeigt wird und Sie können Ihr Programm daher nicht schließen, indem Sie auf die Schließen-Schaltfläche klicken. Also in meiner Lösung werde ich lieber winfo_screenheight() und winfo_screenwidth() verwenden, um self.root auf die Größe des Bildschirms Ihrer Maschine einzustellen und sie innerhalb der geometry() Methode aufzurufen.

Lassen Sie uns teilen Sie Ihr Problem in kleinere:

  1. erstes Problem, das Sie ist lösen müssen, wie das erste Bild setzen f1 und self.label zu gleichen Breiten ?. Dies geschieht, indem Sie einfach die Breite der einzelnen Optionen auf die Hälfte der Bildschirmbreite einstellen: width = self.root.winfo_screenwidth()/2

  2. Sobald dies erledigt ist, müssen Sie das zweite Problem beheben, das Sie in Ihrem Kommentar geklärt haben. Dazu müssen Sie die Größe self.image an die Größe self.label anpassen, indem Sie die Methode resize() auf das Bild anwenden und die Abmessungen des Bildes, die die Ihres Etiketts sein müssen, zusammen mit der Konstanten PIL.Image.ANTIALIAS übergeben.

Volles Programm

Hier ist also das volle Programm:

''' 
Created on May 5, 2016 

@author: billal begueradj 
''' 
import Tkinter as Tk 
import PIL.Image 
import PIL.ImageTk 

class App(object): 
    def __init__(self): 
     self.root = Tk.Tk()  
     self.root.grid_rowconfigure(0, weight=1) 
     self.root.grid_columnconfigure(0, weight=1) 
     self.root.grid_columnconfigure(1, weight=1)   
     # Get width and height of the screen 
     self.h= self.root.winfo_screenheight() 
     self.w= self.root.winfo_screenwidth() 
     # Set the GUI's dimensions to the screen size 
     self.root.geometry(str(self.w) + "x" + str(self.h)) 
     # Set the width of the frame 'f1' to the half of the screen width 
     self.f1 = Tk.Frame(self.root, bd=1, bg="green", width= self.w/2) 
     self.f1.grid(row=0, column=0, sticky="nsew")   
     # Load the image 
     self.image = PIL.Image.open("/home/Begueradj/mahomet_pedophile.jpg")  
     # Resize the image to fit self.label width 
     self.photo = PIL.ImageTk.PhotoImage(self.image) 
     self.label = Tk.Label(self.root, image=self.photo, width= self.w/2) 
     self.label.grid(row=0, column=1, sticky="nsew") 


# Launch the main program  
if __name__ == '__main__': 
    app = App() 
    app.root.mainloop() 

Demo

enter image description here

Nota Bene

Es ist ein wenig Ungenauigkeit durch Ihren Kommentar. Es heißt nicht, dass Sie das gesamte Bild in der gleichen Größe wie das Bild f1 oder nur sein Etikett, in dem es angehängt wird (self.label), erscheinen soll.Wenn das ist, was Sie tun wollen, dann ignorieren Sie diese Zeile im vorherigen Programm:

self.image = self.image.resize((self.w/2, self.h), PIL.Image.ANTIALIAS) 

Demo

Der Ausgang wird dann wie folgt aussehen (das Bild einfach in der Mitte positioniert ist, das Etikett):

]