我刚刚将我在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()
答案 0 :(得分:2)
最佳做法是在应用程序中使用 grid
和pack
。
唯一需要注意的是,你不能在给定的框架内混合它们。为框架中的窗口小部件选择几何管理器(grid
,pack
,place
)完全独立于任何其他框架中使用的几何管理器。每个都有优点和缺点,你应该相应地使用它们。
此外 - 我一直看到这个错误 - 从小部件继承的类应该不调用grid
或pack
或place
就自己而言。
例如,不正确:
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
,那么您将会必须修改十几个其他类。通过让父母负责安排自己的孩子,当你进行布局更改时,你只需要改变一个功能。