Это хороший формат для программы Python с двумя фреймами в одном окне?

Мне нужно окно, которое содержит 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()

Не лучше ли создать один класс с двумя экземплярами класса (левым и правым). И установите размеры окна и т. д. Как переменные экземпляра.

Stef van der Zon 04.12.2018 18:06

Я не понимаю, как бы я это сделал.

Tom Locke 04.12.2018 18:24
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Tom Locke 04.12.2018 20:52

Другие вопросы по теме