Это хороший формат для программы на Python с 2 кадрами в одном окне?
Да и нет.
Да ,в этом очень хорошо создавать отдельные классы для разных разделов вашего пользовательского интерфейса. Нет , поскольку вы неправильно это реализовали.Итак, правильная архитектура, но неправильная реализация.
Рассмотрите этот код:
class left(tk.Frame):
def __init__(self, parent):
self.frame = tk.Frame(parent, height = 2, border = 10, relief = tk.RAISED)
self.frame.pack(fill = tk.X, padx = 5, pady = 5, side = tk.LEFT, expand=True)
tk.Label(self.frame, text="left").pack()
С одной стороны, вы не придерживаетесь PEP8 стандартов.Что еще более важно:
left
- это фрейм , поскольку вы наследуете от tk.Frame
- , вы неправильно вызываете
__init__
суперкласса (tk.Frame
) - вы создаете еще один фрейм внутри
left
, который, насколько я могу судить, не имеет смысла (ну, ни одной цели, которая не может быть в равной степени удовлетворена классомсам)
Другими словами, нет смысла создавать self.frame
, потому что self
сам по себе является фреймом.
Другая проблема заключается в том, что вы позволяете left
и right
упаковывать себя в его родителя.Вы не должны этого делать.Код, который создает left
и right
, должен отвечать за вызов pack
или grid
.
Вот пример, который решает эти проблемы:
import tkinter as tk
class Main(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.title("Frames Test")
self.left = Left(self)
self.right = Right(self)
self.left.pack(fill=tk.X, padx=5, side=tk.LEFT, expand=True)
self.right.pack(fill=tk.X, padx=5, side=tk.LEFT, expand=True)
class Left(tk.Frame):
def __init__(self, parent):
super(Left, self).__init__(parent, height=2, border=10, relief=tk.RAISED)
tk.Label(self, text="left").pack()
class Right(tk.Frame):
def __init__(self, parent):
super(Right, self).__init__(parent, height=2, border=10, relief=tk.RAISED)
tk.Label(self, text="right is larger").pack()
tk.Label(self, text="right is larger").pack()
main = Main()
main.mainloop()