2016-02-02 10 views
5

Sayfa çerçevesinde, iç Çerçevenin içinde iki çerçeveyi ağırlıklandırdım, böylece bunların her biri ekranın yarısını alsın, ancak, bu çerçevelerden birine bir pencere öğesi eklediğimde, örnek kutusu bir örnek olarak kullandım büyüktür, çerçevelerden biri şimdi diğerinden daha fazla alır. Bir pencere öğesi eklendiğinde çerçevelerin boyutlarını değiştirmemesi ve her birinin pencerenin boyutunun yarısı kadar kalması için nasıl yapabilirim?tkinter - Widget eklendiğinde çerçeve değiştirme boyutu nasıl durdurulur?

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

. 'İç Çerçevede 'önce ilk önce yerleştirip ızgara yapılandırmasını kullanın. Genellikle ızgara kullandım, ama belki de yer ve paket kullanma deneyimine sahip biri ayrıntılı olabilir. –

cevap

4

Izgara keyfi bir değerini alır parametresini uniform kabul eder: Burada

With Listbox

Without Listbox

benim kodudur. Aynı değere sahip tüm satırların (veya tüm sütunların) "tekdüze grup" un parçası olduğu kabul edilir. Bu, satırların (veya sütunların), ağırlıklarına orantılı olarak eşit bir boyutta olmasını zorlar.

Bir çerçevede iki satır varsa, her iki satırın da aynı ağırlığı vardır ve her ikisi de aynı tekdüze gruba aittir, her biri kullanılabilir alanın tam% 50'sini alır.

Durumda da bunu yapabilirsiniz:

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

(yine "x" keyfi değil, olabilir herhangi bir değer sürece hem satırlar için aynı değer gibi)

(Tkinter inşa edildiği) tk için resmi belgeler

boş olmayan bir değer verilir -uniform seçenek, diğer satırları ile tek tip grubunda satır yerleştirir (http://tcl.tk/man/tcl8.5/TkCmd/grid.htm#M24 bakınız) şöyle anlatır o var -uniform için aynı değer. Tekdüze bir gruba ait olan satırların alanı, boyutları her zaman ağırlık değerleri ile kesin orantılı olacak şekilde tahsis edilir.

...

birden fazla satır veya sütun düzgün bir gruba ait

, kendilerine ayrılan alanı ağırlıklarına oranla daima. (Sıfır ağırlığı 1 olarak kabul edilir.) Başka bir deyişle, ağırlık 1-üniform ile konfigüre edilmiş bir satır veya sütun, -sağlamlık 1-üniform ile yapılandırılmış diğer herhangi bir satır veya sütun ile tam olarak aynı boyuta sahiptir. Ağırlık 2-üniform b ile konfigüre edilen bir sıra veya kolon, tam olarak 1-üniform b ile konfigüre edilenin iki katı kadar büyük olacaktır.


Not: uniform seçenek Tkinter belgelerinde görünmüyor ama mükemmel geçerli bir seçenektir. Uzun yıllar boyunca tk'nin (üzerinde tüccarın üzerine inşa edildiği) bir parçası olmuştur.

1

Sen çerçeveye bir max-size, min-sixe kullanabilirsiniz: Aynı aletler üzerinde paketi, yeri ve ızgara karıştırma edilmelidir emin değil

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