2016-02-02 8 views
5

Nel frame della pagina, ho pesato due fotogrammi all'interno di innerFrame in modo che occupino ciascuno metà dello schermo, tuttavia, quando aggiungo un widget a uno di questi frame, ho usato un listbox come esempio è grande, uno dei fotogrammi ora occupa più dell'altro. Come faccio a fare in modo che i fotogrammi non cambino le dimensioni quando viene aggiunto un widget e ciascuno rimane metà della dimensione della finestra?tkinter - Come smettere di cambiare le dimensioni del frame quando viene aggiunto il widget?

Without Listbox

With Listbox

Ecco il mio codice:

import tkinter as tk 
from tkinter import ttk 

class Program(tk.Tk):   
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 

     tk.Tk.iconbitmap(self, default = "") 
     tk.Tk.wm_title(self, "") 

     container = tk.Frame(self) 
     container.pack(side="top", fill="both", expand=True) 
     container.grid_rowconfigure(0, weight=1) 
     container.grid_columnconfigure(0, weight=1) 

     self.frames = {} 
     for F in (Page, Other): 

      frame = F(container, self) 
      self.frames[F] = frame 
      frame.grid(row = 0, column = 0, sticky = "nsew") 

     self.show_frame(Page) 

    def show_frame(self,cont): 
     frame = self.frames[cont] 
     frame.tkraise() 


class Page(tk.Frame): 

    def __init__(self, parent, controller): 


     tk.Frame.__init__(self, parent) 

     innerFrame = tk.Frame(self, bg="red") 
     innerFrame.place(relx=.5, rely=.5, anchor="c", relwidth=1.0, relheight=1.0) 


     innerFrame.grid_rowconfigure(0, weight=1) 
     innerFrame.grid_rowconfigure(1, weight=1) 
     innerFrame.grid_columnconfigure(0, weight=1) 

     #First Half 
     frameOne = tk.Frame(innerFrame, bg="pink") 
     frameOne.grid(row=0, sticky="NSWE") 

     #Second Half 
     frameTwo = tk.Frame(innerFrame, bg="green") 
     frameTwo.grid(row=1, sticky="NSWE") 

     lb = tk.Listbox(frameTwo) 
     lb.pack(fill="both", expand=True) 


class Other(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 



app = Program() 
app.state('zoomed') 
app.mainloop() 
+0

Non sono sicuro si dovrebbe essere mescolando pacchetto, luogo e la griglia sugli stessi widget. Su 'innerFrame' lo metti per primo, poi usa la configurazione della griglia. Di solito ho appena usato la griglia, ma forse qualcuno con esperienza nell'uso di place and pack può elaborare. –

risposta

4

griglia accetta il parametro uniform, che assume un valore arbitrario. Tutte le righe (o tutte le colonne) con lo stesso valore sono considerate come parte di un "gruppo uniforme". Questo costringe le righe (o colonne) ad essere una dimensione uniforme in proporzione al loro peso.

Se si dispone di due righe in una cornice, entrambe le righe hanno lo stesso peso ed entrambe appartengono allo stesso gruppo uniforme, occuperanno ciascuna esattamente il 50% dello spazio disponibile.

Nel tuo caso si può fare questo:

innerFrame.grid_rowconfigure(0, weight=1, uniform="x") 
innerFrame.grid_rowconfigure(1, weight=1, uniform="x") 

(ancora una volta, la "x" è arbitraria, ma può essere qualsiasi valore fintanto che è lo stesso valore per entrambe le righe)

Il documentazione ufficiale per tk (su cui è costruita tkinter) descrive così (vedi http://tcl.tk/man/tcl8.5/TkCmd/grid.htm#M24)

l'opzione Uniform, quando viene fornito un valore non vuoto, pone la riga in un gruppo uniforme con altre righe avere lo stesso valore per -uniforme. Lo spazio per le righe appartenenti a un gruppo uniforme viene assegnato in modo che le loro dimensioni siano sempre in stretta proporzione ai loro valori di peso.

...

Quando più righe o colonne appartengono ad un gruppo omogeneo, lo spazio loro assegnato è sempre proporzionale al loro peso. (Un peso pari a zero è considerato pari a 1.) In altre parole, una riga o una colonna configurata con -weight 1 -uniforma avrà esattamente le stesse dimensioni di qualsiasi altra riga o colonna configurata con -weight 1 -uniforma a. Una riga o colonna configurata con -weight 2-uniforme b sarà esattamente il doppio di quella configurata con -weight 1 -uniforme b.


Nota: l'opzione uniform non compare nella documentazione Tkinter, ma è una scelta perfettamente valido. È stata una parte di tk (su cui è costruito tkinter) per molti, molti anni.

1

È possibile utilizzare un max-size, min-sixe al telaio:

master = tk() 
master.minsize(width=777, height=777) 
master.maxsize(width=777, height=777) 
Problemi correlati