主要和类中的网格和包?

时间:2015-02-18 04:23:12

标签: python tkinter grid pack

我刚刚将我在Tkinter的布局从包转移到了网格。这很顺利。我在我的Main函数中错误地使用了pack和grid。我解决它,而不仅仅是使用抓地力。但我意识到我仍然在一个同时构建Tkinter小部件的类中使用pack。这些都是标签。看来这没关系,但是我认为这不是一个好习惯。如果我在Class中使用一个网格,那么这会在Main的网格中嵌入自己的网格吗?当在类中创建一些小部件而在Main中创建一些小部件时,布局屏幕的最佳方法是什么?

所以这里的课程仍在其中......

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

1 个答案:

答案 0 :(得分:2)

最佳做法是在应用程序中使用 gridpack

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

此外 - 我一直看到这个错误 - 从小部件继承的类应该调用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(或grid或{{1} }}):

place

第一个(不正确)示例的问题是,如果您在main中有十几个框架以及其他一些小部件,那么如果您决定从class Main(tk.Frame): def __init__(self, parent): ... this.example = Example(self) this.example.pack(...) 切换到pack,那么您将会必须修改十几个其他类。通过让父母负责安排自己的孩子,当你进行布局更改时,你只需要改变一个功能。