2016-02-02 34 views
5

Pageフレームでは、innerFrame内に2つのフレームを重み付けしてそれぞれが画面の半分を占めるようにしましたが、これらのフレームの1つにウィジェットを追加すると、リストボックスを例として使用しましたが大きい場合は、フレームの1つがもう一方のフレームより多く取り込まれます。ウィジェットが追加され、それぞれがウィンドウのサイズの半分のままになっているときに、フレームがサイズを変更しないようにするにはどうすればよいですか?ここtkinter - ウィジェットの追加時にフレームのサイズ変更を止めるには?

Without Listbox

With Listbox

私のコードである:

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

ないあなたは同じウィジェットにパック、場所やグリッドを混合する必要があることを確認。 'innerFrame'では最初に配置し、次にグリッド設定を使用します。私は通常グリッドを使用していますが、場所やパックを使用した経験がある人もいます。 –

答えて

4

グリッドは、任意の値をとるパラメータuniformを受け付けます。同じ値を持つすべての行(またはすべての列)は、「統一グループ」の一部とみなされます。これにより、行(または列)がその重みに比例して均一なサイズになります。

フレームに2つの行がある場合、両方の行は同じ重みを持ち、両方とも同じ統一グループに属し、それぞれが使用可能な領域のちょうど50%を占めます。

あなたがこれを行うことができますあなたの場合は

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

(再び、「x」は任意であり、それは限り、それは両方の行に対して同じ値だとして任意の値を指定できます)

TKの公式文書(Tkinterのが構築される際に)、このようにそれを記述する(http://tcl.tk/man/tcl8.5/TkCmd/grid.htm#M24参照)

-uniformオプション、空でない値が供給されると、その他の行との均一な群内の行を配置持ってる -uniformの値は同じです。均一なグループに属する行のスペースは、そのサイズが常にその重み値に厳密に比例するように割り当てられます。

...

複数の行または列が均一なグループに属している場合は、それらに割り当てられたスペースは、その重みに比例して常にあります。つまり、weight -weight 1-uniform aで構成された行または列は、weight -weight 1-uniform aで構成された他の行または列とまったく同じサイズになります。 -weight 2 -uniform bで構成された行または列は、-weight 1-uniform Bで構成された行または列の正確に2倍になります。


注:uniformオプションはTkinterの文書に表示されませんが、それは完全に有効なオプションです。それは何年もの間、tk(tkinterが構築されている)の一部です。

1

あなたはフレームにmax-sizemin-sixeを使用することができます。

master = tk() 
master.minsize(width=777, height=777) 
master.maxsize(width=777, height=777) 
関連する問題