2017-03-29 94 views
0

我已閱讀rowconfugre和columnconfigure的文檔,我只是不太明白如何使其正常工作。使用以下代碼,無論第1列中的其他小部件是什麼,我如何直接對'src'Checkbutton獲取'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原因是,你試圖迫使一切放到一個網格中,但是您沒有自然適合網格的項目。您可以通過使用大量不可見的列和巧妙使用columnspan來使其工作,但有更簡單的方法。

在這個特定的情況下,pack和幾個中間幀是我認爲更好的解決方案。

從我所看到的,你的UI是由四個方面:

  1. 具有用於int_entry和條目的checkbutton
  2. 具有幾個複選框,單選按鈕一排,與沿行進入
  3. 一排的「與」和「或」單選按鈕
  4. 一大空白區域

的方式我會d ·其是創建四個幀,每一個區域:

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

然後可以使用pack到堆棧水平的幀。它們都在水平方向上填充它們的區域,最後一幀佔用其餘所有數據。

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) 

現在,您可以將小部件添加到每個幀,而不必擔心它們如何影響顯示的其餘部分。

例如,「接口」標籤,條目和「任何」檢查按鈕都可以進入frame1。 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") 

對其他框架做同樣的事情。在每個框架內,只要您始終爲框架內的每個窗口小部件使用packgrid,您就可以選擇使用packgrid。當你想讓所有的小部件在父小部件的一個方向上對齊時,pack是非常自然的選擇。

+0

謝謝Bryan,這個作品很棒,我很感謝你的快速回復。 – Clyde