管理列宽tkinter

时间:2017-03-29 18:43:38

标签: python tkinter

我已经查看了关于rowconfugre和columnconfigure的文档,我只是不太明白如何让它正常工作。使用以下代码,我如何获得' src_entry'直接针对'src'的输入框检查按钮,无论第1列中的其他小部件是什么?基本上,我需要列的大小来形成网格上该空间中任何小部件的宽度。

谢谢,

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()

1 个答案:

答案 0 :(得分:2)

做布局的最好方法是将UI分成几个部分,然后独立地布局每个部分。你遇到困难的原因是你试图强迫所有部分进入一个网格,但是你没有有自然适合网格的项目。您可以通过使用大量不可见的列并巧妙地使用columnspan来使其工作,但有更简单的方法。

在这种特定情况下pack和一些中间框架在我看来是更好的解决方案。

据我所知,你的用户界面由四个方面组成:

  1. 包含int_entry条目和检查按钮
  2. 的行
  3. 包含多个复选框和单选按钮的行以及条目
  4. 带有'And'和'Or'单选按钮的行
  5. 一个很大的空白区域
  6. 我这样做的方法是创建四个帧,每个区域一个:

    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)
    

    现在,您可以为每个帧添加小部件,而不必担心它们如何影响显示的其余部分。

    例如,“Interface”标签,条目和“Any”检查按钮可以在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是一个非常自然的选择。