Main 和 Class 中的网格和打包?

Grid and Pack in Main and Class?

我刚刚将我在 Tkinter 中的布局从包移动到网格。这进展顺利。我在 Main 函数中错误地同时使用了 pack 和 grid。我修复它,而不仅仅是使用抓地力。但我意识到我仍在 class 中使用 pack,它也构建了 Tkinter 小部件。这些都是标签。看起来这没问题并且有效,但我认为这不是一个值得遵循的好习惯。如果我在 Class 中使用网格,那么它会在 Main 的网格中嵌入自己的网格吗?当在 class 中创建一些小部件而在 Main 中创建一些小部件时,布局屏幕的最佳方式是什么?

所以这是 class 包还在里面....

class StopWatch(Frame):
    ...

    def makeWidgets(self):
        """ Make the time labels. """
        la = Label(self, textvariable=self.timestr)
        la.pack(fill=X, expand=NO, pady=2, padx=2)

        lb = Label(self, textvariable=self.timestr)
        lb.pack(fill=X, expand=NO, pady=2, padx=2)

        lc = Label(self, textvariable=self.timestr)
        lc.pack(fill=X, expand=NO, pady=2, padx=2)

        ld = Label(self, textvariable=self.timestr)
        ld.pack(fill=X, expand=NO, pady=2, padx=2)

        lsplita = Label(self, textvariable=self.lapastr)
        lsplita.pack(fill=X, expand=NO, pady=2, padx=2)

        lsplitb = Label(self, textvariable=self.lapbstr)
        lsplitb.pack(fill=X, expand=NO, pady=2, padx=2)

        lsplitc = Label(self, textvariable=self.lapcstr)
        lsplitc.pack(fill=X, expand=NO, pady=2, padx=2)

        lsplitd = Label(self, textvariable=self.lapdstr)
        lsplitd.pack(fill=X, expand=NO, pady=2, padx=2)

        self._setTime(self._elapsedtime)

现在这是我的主要网格....

def main():
    root = Tk()
    root.geometry("500x400")
    sw1 = StopWatch(root)
    sw1.grid(row=0, column=5, rowspan=2)

    b1 = Button(root, text='Start', command=sw1.Start)
    b2 = Button(root, text='Stop', command=sw1.Stop)
    b3 = Button(root, text='Reset', command=sw1.Reset)
    b4 = Button(root, text='Quit', command=root.quit)
    b5 = Button(root, text='Get Split A', command=sw1.Getsplita)
    b6 = Button(root, text='Get Split B', command=sw1.Getsplitb)
    b7 = Button(root, text='Get Split C', command=sw1.Getsplitc)
    b8 = Button(root, text='Get Split D', command=sw1.Getsplitd)
    b1.grid(row=0, column=0)
    b2.grid(row=0, column=1)
    b3.grid(row=0, column=2)
    b4.grid(row=0, column=3)
    b5.grid(row=1, column=0)
    b6.grid(row=1, column=1)
    b7.grid(row=1, column=2)
    b8.grid(row=1, column=3)

    root.mainloop()

最好在一个应用程序中同时使用gridpack

唯一需要注意的是您不能在给定的框架内混合使用它们。框架中小部件的几何管理器(gridpackplace)的选择完全独立于任何其他框架中使用的几何管理器。每个都有优点和缺点,你应该相应地使用它们。

另外——我经常看到这个错误——从小部件继承的 class 应该 而不是 调用 gridpackplace 本身。

例如,这是不正确的

class Example(tk.Frame):
    def __init__(self, parent):
        ...
        self.pack(...)

class Main(tk.Frame):
    def __init__(self, parent):
        ...
        this.example = Example(self)

而不是上面的, pack 应该从 Example 中删除, Main 应该被重新定义为调用 pack (或 gridplace):

class Main(tk.Frame):
    def __init__(self, parent):
        ...
        this.example = Example(self)
        this.example.pack(...)

第一个(不正确的)示例的问题在于,如果您在 main 中有十几个框架以及一些其他小部件,如果您决定从 pack 切换到 grid,您将不得不修改其他十几个 classes。通过让 parent 负责安排它自己的 children,当您更改布局时,您只需更改一个功能。