2017-01-13 8 views
0

Ich mache ein Projekt zu Hause nur versucht, ein Fenster mit 3 (technisch 4) Frames zu erstellen. Ich habe einen oberen Rahmen, der 2 Rahmen hat (ich möchte einen linken und rechten Rahmen) dann habe ich einen unteren Rahmen, der alles andere abdeckt. Dieser untere Rahmen wird eventuell einen externen Prozess enthalten, aber für ein Bild, das nicht den gesamten Platz einnehmen wird. Der obere Raum wird nicht gleichmäßig aufgeteilt, auch wenn ich die Höhe und Breite gleichmäßig an einem Punkt aufspalte. Ich werde meinen Code senden und ein Bild unten zeigen.Python Tkinter Fenster/Rahmen Anpassung Probleme beim Ausrichten Probleme 2.7

def createFrames(self): 
    #Main Upper Frame 
    topFrame = Frame(height=120, width=800, bd=1, relief=SUNKEN) 
    topFrame.pack(side=TOP) 

    #Left Frame in Main Upper Frame 
    topFrameLeft = Frame(topFrame, height=120, width=400) 
    topFrameLeft.pack(side=LEFT) 

    #Right Frame in Main Upper Frame 
    topFrameRight = Frame(topFrame, height=120, width=400) 
    topFrameRight.pack(side=RIGHT) 

    #Frame for GPS, Lower 
    centerFrame = Frame(width=800, height=400, bg="", 
         colormap="new",bd=3, relief=GROOVE) 
    centerFrame.pack(side=BOTTOM, fill=BOTH, expand=True) 

    #photo stuff 
    photo = PhotoImage(file="GPS_Imitation.gif") 
    #scale_w = 3 
    #scale_h = 400/200 
    #photo = photo.zoom(scale_w, scale_h) 
    #photo = photo.subsample(1) 
    Image_Label = Label(centerFrame, image=photo) 
    Image_Label.photo = photo 
    Image_Label.pack(fill=BOTH, expand=True) 

    #Label for Left Frame 
    Left_Label = Label(topFrameLeft, width=56, text="Audio", bg="gray", 
         fg="blue") 
    Left_Label.pack() 

    #Label for Right Frame 
    Right_Label = Label(topFrameRight, width=60, 
         text="Phone/Notification", 
         bg="Green", fg="Black") 
    Right_Label.pack() 

Picture of Window

Ich stellte die Funktion. Ich musste ein paar komische Sachen mit dem Code machen, um es so zu machen. aber das Bild wird nicht erweitert, es graut nur unter und über dem Bild aus. und ich musste die topleft und topright Etiketten in der Breite und Höhe zufällig ändern. Jede Hilfe wäre es zu schätzen. Dies ist in Python mit Tkinter geschrieben!

+1

Um Frames daran zu hindern, ihre Größe anzupassen, um ihren Inhalt anzupassen, können Sie das Widget '.pack_propagate' verwenden. –

+1

Vielleicht sollten Sie '.grid()' anstelle von '.pack()' überprüfen. – Lafexlos

+0

@ PM2Ring: Technisch stimmt das Ausschalten der Geometrieausbreitung fast immer der falschen Lösung, wenn Sie einfach zu wartende Responsive Guis haben wollen. –

Antwort

0

Es ist schwierig, eine definitive Antwort zu geben, da das GUI-Layout sehr stark von den Besonderheiten abhängt. Was geht in den Rahmen? Wie sollen sie sich bei der Größenanpassung verhalten? Was passiert, wenn das Fenster zu klein ist?

Wenn ich dies tun würde, würde ich wahrscheinlich die internen Frames loswerden und alles in ein Raster setzen, da es scheint, dass Sie zwei Spalten und zwei oder drei Zeilen haben. Allerdings hängt diese Entscheidung wirklich davon ab, was sonst in verschiedene Zeilen und Spalten geschrieben wird.

Es ist nichts falsch mit pack und zusätzlichen Hilfsrahmen (das ist oft meine erste Wahl!), grid ist wohl das beste Werkzeug für den Job, wenn Sie die Breite von zwei Spalten oder mehr Spalten identisch sein wollen.

Mit dem Raster können Sie Spalten so konfigurieren, dass sie in einer einheitlichen Gruppe liegen. Jede Spalte mit dem gleichen Wert für das Attribut uniform hat die gleiche Größe. Um beispielsweise sicherzustellen, dass topFrameLeft und topFrameRight genau gleich sind, können Sie sie in eine einheitliche Gruppe innerhalb von topFrame einfügen.

starten grid unter Verwendung der Widgets innerhalb von TopFrame zu platzieren:

topFrameLeft.grid(row=0, column=0, sticky="nsew") 
topFrameRight.grid(row=0, column=1, sticky="nsew") 

Als nächstes konfigurieren Sie die einheitliche Spalten. Hinweis: Es empfiehlt sich, mindestens einer Zeile und einer Spalte immer ein Gewicht zuzuweisen, auch wenn Sie nur eine Zeile oder eine Spalte verwenden.

topFrame.grid_rowconfigure(0, weight=1) 
topFrame.grid_columnconfigure(0, uniform="half", weight=1) 
topFrame.grid_columnconfigure(1, uniform="half", weight=1) 

Hinweis: Sie können weiterhin pack für alle anderen Widgets verwenden. Sie können pack, place und grid in einer Anwendung frei mischen und abgleichen, solange Sie sie nicht mit Widgets mischen, die denselben Parent verwenden.

Verwandte Themen