Это хороший формат для программы на Python с 2 кадрами в одном окне? - PullRequest
0 голосов
/ 04 декабря 2018

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

1 Ответ

0 голосов
/ 04 декабря 2018

Это хороший формат для программы на 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...