2016-07-22 2 views
2

Ich habe 3 Frames (Seiten) für meine GUI erstellt und ein paar Widgets hinzugefügt, um ein grundlegendes Framework meiner GUI zu zeigen.Das Hinzufügen von Widgets zur dritten Seite bewirkt, dass Frames die Größe anpassen

Ich habe die Methode .grid_propagate(0) verwendet, um meine Frames daran zu hindern, die Größe basierend auf den Widgets in ihnen anzupassen.

siehe unten Code:

from Tkinter import * 
# from tkFileDialog import askopenfilename 
# from Function_Sheet import * 
# from time import sleep 
# import ttk, ttkcalendar, tkSimpleDialog, csv, pyodbc, threading 
# from Queue import Queue 
# import os 
# cwd = os.getcwd() 


class CA_GUI: 

    def __init__(self, master): 
     ### Configure ### 
     win_colour = '#D2B48C' 
     master.title('CA 2.0'), master.geometry('278x289'), master.configure(background='#EEE5DE') 
     win1, win2, win3 = Frame(master, background=win_colour, bd=5, relief=GROOVE, pady=10, padx=20, width=260, height = 270), Frame(master, background=win_colour, bd=5, relief=GROOVE, pady=10, padx=20, width=260, height = 270), Frame(master, background=win_colour, bd=5, relief=GROOVE, pady=10, padx=20, width=260, height = 270) 

     ### Grid Frames ### 
     for window in [win1,win2,win3]: 
      window.grid(column=0, row=0, sticky='news', pady=10, padx=10) 
      window.grid_propagate(0) 

     ### Window 1 ### 
     self.win1_label1 = Label(win1, text = 'This is page 1!') 
     self.win1_label1.pack(fill = X, side = TOP) 

     self.win1_button1 = Button(win1, text = 'Close', command = master.quit) 
     self.win1_button1.pack(fill = X, side = BOTTOM) 

     self.win1_button2 = Button(win1, text = 'Page 2', command = lambda:self.next_page(win2)) 
     self.win1_button2.pack(fill = X, side = BOTTOM) 

     ### Window 2 ### 
     self.win2_label1 = Label(win2, text = 'This is page 2!') 
     self.win2_label1.pack(fill = X, side = TOP) 

     self.win2_button1 = Button(win2, text = 'Close', command = master.quit) 
     self.win2_button1.pack(fill = X, side = BOTTOM) 

     self.win2_button2 = Button(win2, text = 'Page 3', command = lambda:self.next_page(win3)) 
     self.win2_button2.pack(fill = X, side = BOTTOM) 

     ### Window 3 ### 
     self.win3_label1 = Label(win3, text = 'This is page 3!') 
     self.win3_label1.pack(fill = X, side = TOP) 

     win1.tkraise() 

    def next_page(self, window): 
     window.tkraise() 

root = Tk() 
b = CA_GUI(root) 
root.mainloop() 

Das Problem kommt, wenn ich Widgets win3 Zugabe bin. Wenn ich den Code, der sich auf win3 bezieht, auskommentieren, bleiben alle Rahmen in ihrer spezifizierten Größe und alles sieht gut aus. Wenn Sie sogar ein einfaches Label-Widget zu win3 hinzufügen, scheinen sich die Frames-Größen an die Größe ihrer Widgets anzupassen. - Das will ich nicht!

P.S.

Das Problem scheint nicht ausschließlich win3 zu sein, da das Auskommentieren eines anderen Frames-Widgets das Problem der Größenänderung löst.

Jede Rückmeldung wäre willkommen!

+0

Hinweis: 'grid_propagate (0)' hat keine Auswirkungen, wenn Sie 'pack' verwenden, um die Widgets in den Rahmen zu setzen. Sie müssen 'pack_propagate' verwenden, wenn Sie' pack' verwenden. –

Antwort

1

Meine Empfehlung ist, die Geometrieausbreitung niemals zu deaktivieren. Es ist fast immer die falsche Wahl. Tkinter leistet fantastische Arbeit, um Widgets effizient auszulegen. Lassen Sie den Rahmen verkleinern (oder vergrößern), um ihn an den Inhalt anzupassen, und verwenden Sie den Geometrie-Manager, um den Rahmen an den zugewiesenen Platz anzupassen.

Das Problem in diesem Code ist, dass Sie Grid nicht zulassen, den gesamten Speicherplatz den Frames zuzuweisen. Sie müssen mindestens eine Zeile und eine Spalte "Gewicht" angeben, damit das Raster dieser Zeile und Spalte zusätzlichen Platz zuweist, sodass die Rahmen den Platz ausfüllen und nicht verkleinern.

Ändern Sie den einen Abschnitt des Codes wie folgt aussehen:

### Grid Frames ### 
master.grid_rowconfigure(0,weight=1) 
master.grid_columnconfigure(0,weight=1) 

for window in [win1,win2,win3]: 
    window.grid(column=0, row=0, sticky='news', pady=10, padx=10) 

Das alles funktioniert, weil Sie eine explizite Größe zum Hauptfenster sind zu geben. In einem gewissen Sinn wird durch das Festlegen einer festen Größe für das Fenster die automatische Größenanpassung des Fensters basierend auf seinen unmittelbaren Kindern deaktiviert. Wenn die Größenanpassung deaktiviert ist und die Rasteroptionen ordnungsgemäß verwendet werden, füllen die inneren Rahmen das Fenster aus.

Natürlich, wenn Sie Widgets, die zu groß sind, um zu passen, werden sie abgehackt werden. Dies ist der Preis, den Sie für die Verwendung von expliziten Größen zahlen, anstatt tkinter wachsen oder verkleinern zu lassen, um zu passen.

+0

Danke Brian. Ihre Antwort erklärt alles sehr gut und verdeutlicht die Probleme, die ich hatte. Mit freundlichen Grüßen, Luke. –

0

Innerhalb Ihrer drei Fenster packen Sie die Widgets, nicht griding sie. Also alles, was Sie tun müssen, ist diese Zeile zu ändern:

window.grid_propagate(0) 

zu:

window.pack_propagate(0) 

Nach so tun, werden Sie bekommen, was Sie erwarten:

enter image description here

+0

Danke für Ihre Eingabe. Wenn ich jedoch ein Paket verwende, werden alle drei Fenster vertikal angeordnet und sind sofort sichtbar. Das brauche ich leider nicht! –

+0

Gern geschehen.Ich sehe ein Fenster pro Zeit, wenn ich dein Programm nach der Änderung oben laufe, wie du aus dem Screenshot sehen kannst, den ich gemacht habe. –

+0

Ich kann das sehen! :) Ich würde meinen eigenen Screenshot posten, kann aber nicht in den Kommentaren! –

Verwandte Themen