Рамка обычно используется как мастер геометрии для других виджетов .
Так как в приложении обычно есть множество виджетов, вам часто захочется разместить их все во фрейме или, по крайней мере, использовать фрейм для добавления некоторого borderwidth
, отступов или других мелких деталей.
Многие примеры фрагментов, которые вы можете найти в Интернете, не используют фрейм, потому что
они просто хотят продемонстрировать некоторую особенность в кратчайшем объеме кода.
Итак, используйте Рамку, если она вам нужна, иначе не используйте.
Редактировать : Я думаю, что лучший способ организовать графический интерфейс приведен в этом Tkinter учебнике :
simpleApp.py:
import Tkinter as tk
class SimpleApp(object):
def __init__(self, master, **kwargs):
title=kwargs.pop('title')
frame=tk.Frame(master, **kwargs)
frame.pack()
self.label = tk.Label(frame, text=title)
self.label.pack(padx=10,pady=10)
if __name__=='__main__':
root = tk.Tk()
app = SimpleApp(root,title='Hello, world')
root.mainloop()
Это в основном похоже на ваш первый пример, в котором SimpleApp
наследуется от object
, а не Frame
. Я думаю, что это лучше, чем создавать подклассы Frame
, поскольку мы не переопределяем методы Frame
. Я предпочитаю думать о SimpleApp
как о Frame
, а не как Frame
.
Наличие SimpleApp
подкласса object
имеет существенное преимущество перед подклассом tk.Tk
, однако: оно позволяет легко встраивать SimpleApp
в более крупное приложение:
import simpleApp
import Tkinter as tk
class BigApp(object):
def __init__(self, master, **kwargs):
title=kwargs.pop('title')
frame=tk.Frame(master, **kwargs)
frame.pack()
self.simple = simpleApp.SimpleApp(frame,title=title)
frame.pack(padx=10, pady=10)
self.simple2 = simpleApp.SimpleApp(frame,title=title)
frame.pack()
if __name__=='__main__':
root = tk.Tk()
app = BigApp(root,title='Hello, world')
root.mainloop()
Таким образом, simpleApp.py может быть как автономным скриптом, так и импортируемым модулем.
Если вы попробуете это с SimpleApp
наследованием от tk.Tk
, вы получите дополнительные нежелательные окна.