Мне нужно окно, которое содержит 2 фрейма в одном окне для целей форматирования. Я новичок в объектно-ориентированном программировании. Я придумал это (потребовалось немного времени, чтобы заставить его работать, много исследований). Это правильное использование структур классов? Должны ли левый и правый классы наследовать основной класс вместо tk.Frame?
import tkinter as tk
class main(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.title("Frames Test")
# self.resizable(width = False, height = False)
self.left = left(self)
self.right = right(self)
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()
class right(tk.Frame):
def __init__(self, parent):
self.frame = tk.Frame(parent, height = 2, border = 10, relief = tk.GROOVE)
self.frame.pack(fill = tk.X, padx = 5, pady = 5, side = tk.LEFT, expand=True)
tk.Label(self.frame, text = "right is larger").pack()
tk.Label(self.frame, text = "right is larger").pack()
main = main()
main.mainloop()
Я не понимаю, как бы я это сделал.






Is this a good format for a Python program with 2 frames on one window?
И да и нет.
да, потому что очень хорошо создавать отдельные классы для разных разделов вашего пользовательского интерфейса. Нет, в том, что вы его неправильно реализовали. Итак, правильная архитектура, но неправильная реализация.
Рассмотрим этот код:
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()
Это имеет смысл для меня. Классы и их наследования все еще несколько сбивают с толку. Придется посмотреть на PEP8. Я обнаружил, что с python 3.7 я мог бы также использовать super ().
Не лучше ли создать один класс с двумя экземплярами класса (левым и правым). И установите размеры окна и т. д. Как переменные экземпляра.