Python 管理列宽tkinter

Python 管理列宽tkinter,python,tkinter,Python,Tkinter,我已经阅读了关于rowconfugre和columnconfigure的文档,但我不太明白如何让它正常工作。在下面的代码中,我如何直接根据“src”复选按钮获取“src_entry”输入框,而不管第1列中还有什么其他小部件?本质上,我需要将列的大小设置为网格上该空间中任何小部件的宽度 谢谢 from tkinter import * class Example(Frame): def __init__(self, parent): Frame.__init__(s

我已经阅读了关于rowconfugre和columnconfigure的文档,但我不太明白如何让它正常工作。在下面的代码中,我如何直接根据“src”复选按钮获取“src_entry”输入框,而不管第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()

布局的最佳方法是将UI分成多个部分,然后独立地布局每个部分。您遇到困难的原因是,您试图将所有内容强制放到一个网格中,但没有适合网格的项。通过使用大量不可见的列和巧妙地使用
columnspan
,您可以使其工作,但有更简单的方法

在这种特殊情况下,
包和一些中间帧在我看来是更好的解决方案

据我所见,您的UI由四个区域组成:

  • 具有
    int\u entry
    条目和复选按钮的行
  • 具有多个复选框和单选按钮以及一个条目的行
  • 带有“And”和“And”或“Or”单选按钮的行
  • 一个很大的空白区域
  • 我的方法是创建四个帧,每个区域一个:

    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
    grid
    ,只要您始终对框架内的每个小部件使用
    pack
    grid
    <当您希望所有小部件在父小部件中沿一个方向对齐时,code>pack是一个非常自然的选择

    进行布局的最佳方法是将UI划分为多个部分,然后独立地对每个部分进行布局。您遇到困难的原因是您试图将所有内容强制放到一个网格中,但您没有自然适合网格的项目。通过使用大量不可见的列和巧妙地使用
    columnspan
    ,您可以使其工作,但有更简单的方法

    在这种特殊情况下,
    包和一些中间帧在我看来是更好的解决方案

    据我所见,您的UI由四个区域组成:

  • 具有
    int\u entry
    条目和复选按钮的行
  • 具有多个复选框和单选按钮以及一个条目的行
  • 带有“And”和“And”或“Or”单选按钮的行
  • 一个很大的空白区域
  • 我的方法是创建四个帧,每个区域一个:

    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
    grid
    ,只要您始终对框架内的每个小部件使用
    pack
    grid
    <当您希望所有小部件在父小部件中沿一个方向对齐时,code>pack是一个非常自然的选择

    谢谢你,布莱恩,这很有效,我感谢你的快速反应。谢谢你,布莱恩,这很有效,我感谢你的快速反应。