2017-03-29 6 views
0

私はrowconfugreとcolumnconfigureのドキュメントを見直しましたが、正しく動作させる方法をあまり理解していません。次のコードでは、どのように他のウィジェットが列1にあるかにかかわらず、 'src'チェックボックスに対して 'src_entry'エントリボックスを直接取得できますか?基本的には、グリッド上のスペースにあるウィジェットの幅に合わせて列のサイズが必要です。列幅の管理tkinter

、その後のおかげで、

from tkinter import * 



class Example(Frame): 

    def __init__(self, parent): 
     Frame.__init__(self, parent, background="white") 
     self.parent = parent 
     self.parent.title("TCPDUMP Creator") 
     self.centerWindow() 
     self.pack(fill=BOTH, expand=1) 

     menubar = Menu(self.parent) 
     self.parent.config(menu=menubar) 
     fileMenu = Menu(menubar) 
     fileMenu.add_command(label="Exit", command=self.quit) 
     menubar.add_cascade(label="File", menu=fileMenu) 
     self.columnconfigure(2, weight=5) 

     int_lbl = Label(self, text="Interface") 
     int_lbl.grid(row=1, column=0, sticky=W+E) 
     self.int_entry = Entry(self, width=15) 
     self.int_entry.grid(row=1, column=1) 

     self.anyInt = BooleanVar() 
     Checkbutton(self, text="Any", variable = self.anyInt).grid(row=1, column=2) 

     int_lbl = Label(self, text="") 
     int_lbl.grid(row=2, column=0, columnspan=99, sticky=W+E) 

     self.notSrc = BooleanVar() 
     Checkbutton(self, text = "Not--", variable = self.notSrc).grid(row=3, column=0, sticky=W+E) 

     self.srcIP = BooleanVar() 
     Checkbutton(self, text="Src", variable = self.srcIP).grid(row=3, column=1) 

     src_entry = Entry(self, width=15) 
     src_entry.grid(row=3, column=2) 

     self.AndOr = StringVar() 
     self.AndOr.set(None) 

     Radiobutton(self, text = "And", variable = self.AndOr, value = "And").grid(row=3, column=3, pady=5, padx=2, sticky=E) 
     Radiobutton(self, text = "Or", variable = self.AndOr, value = "Or").grid(row=3, column=4, pady=5, padx=10, sticky=W) 

     self.notDst = BooleanVar() 
     Checkbutton(self, text = "Not--", variable = self.notDst).grid(row=3, column=5, sticky=W+E) 

     self.dstIP = BooleanVar() 
     Checkbutton(self, text="Dst", variable = self.dstIP).grid(row=3,column=6, sticky=E, padx=0) 

     dst_entry = Entry(self, width=15) 
     dst_entry.grid(row=3, column=7) 

     int_lbl = Label(self, text="") 
     int_lbl.grid(row=4, column=0, columnspan=99, sticky=W+E) 


     self.srcordst = StringVar() 
     self.srcordst.set(None) 

     Radiobutton(self, text = "And", variable = self.srcordst, value = "And").grid(row=4, column=1, pady=5, padx=2, sticky=E) 
     Radiobutton(self, text = "Or", variable = self.srcordst, value = "Or").grid(row=4, column=2, pady=5, padx=10, sticky=W) 


    def centerWindow(self): 
     w = 600 
     h = 300 
     sw = self.parent.winfo_screenwidth() 
     sh = self.parent.winfo_screenheight() 
     x = (sw - w)/2 
     y = (sh - h)/2.7 
     self.parent.geometry("%dx%d+%d+%d" % (w, h, x, y)) 




def main(): 
    root = Tk() 
    app = Example(root) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

答えて

2

レイアウトを行うための最善の方法は、セクションにあなたのUIを破ることで、あなたが困難を抱えている各セクションindependently.Theの理由は、あなたがすべてを強制しようとしているということであるレイアウト1つのグリッドにすることはできますが、グリッドに自然にフィットするアイテムはありません。目に見えない列がたくさんあり、巧妙に使用することで効果を出すことができますが、簡単な方法があります。

この特定のケースでは、,packと私の意見では、いくつかの中間フレームがより良い解決策です。私が見たものから、

、あなたのUIは、次の4つの領域で構成されています

  1. とともに、int_entryのエントリとチェックボタン
  2. いくつかのチェックボックスやラジオボタンを持つ行を持つ行私はDだろう「と」と「または」ラジオボタン
  3. 大きな空白領域

方法でエントリー

  • frame1 = Frame(self, ...) 
    frame2 = Frame(self, ...) 
    frame3 = Frame(self, ...) 
    frame4 = Frame(self, ...) 
    

    あなたはその後、水平にそれらのフレームをスタックするpackを使用することができます。oそれは4つのフレーム、各エリアに1つを作成することです。それらのすべてがその領域を水平方向に満たし、最後のフレームが残りのデータのすべてを占有する。今

    frame1.pack(side="top", fill="x") 
    frame2.pack(side="top", fill="x") 
    frame3.pack(side="top", fill="x") 
    frame4.pack(side="top", fill="both", expand=True) 
    

    、あなたは彼らが、ディスプレイの残りの部分にどのような影響を与えるかについて少し心配して、各フレームにウィジェットを追加することができます。

    たとえば、「インターフェイス」ラベル、エントリ、および「任意の」チェックボタンは、フレーム1に入ることができます。 packは、これらを領域の左側に揃えたいので、賢明な選択となります(私は仮定します...)。

    int_lbl = Label(frame1, text="Interface") 
    self.int_entry = Entry(frame1, width=15) 
    any_cb = Checkbutton(frame1, text="Any", ...) 
    
    int_lbl.pack(side="left") 
    self.int_entry.pack(side="left") 
    any_cb.pack(side="left") 
    

    他のフレームでも同じことをします。フレーム内のすべてのウィジェットに一貫してpackまたはgridを使用する場合は、各フレーム内でpackまたはgridのいずれかを選択できます。 packは、親ウィジェット内のすべてのウィジェットを一方向に揃えたい場合、非常に自然な選択です。

  • +0

    ありがとうブライアン、これは素晴らしい作品です、私はあなたの迅速な対応に感謝します。 – Clyde

    関連する問題