Передача аргумента в фрейм TkInter - PullRequest
0 голосов
/ 29 января 2020

Я учитель, и каждую неделю я оцениваю баллы за участие студентов. Так как я преподаю компьютеры, я подумал, что создам программу для обработки этого логика c для меня. Я планирую использовать TkInter для создания стартового экрана с четырьмя периодами дня, и в зависимости от периода он будет включать этот класс. Но я пытаюсь использовать один и тот же класс для всех 4 периодов, поскольку код точно такой же.

Вот мой код:

class part(tk.Tk):
    #Creates a class for the GUI

    def __init__(self, *args, **kwargs):
        #Initialization function of partGUI
        tk.Tk.__init__(self, *args, **kwargs)

        tk.Tk.iconbitmap(self, default="") #default icon in an .ico file
        tk.Tk.wm_title(self, "Lucey's Participation Program") #title

        window = tk.Frame(self)
        window.pack(side="top", fill="both", expand=True)
        window.grid_rowconfigure(0, weight=1)
        window.grid_columnconfigure(0, weight=1)

        self.frames= {}



        for F in (StartPage, ClassPart, SettingsPage):
            frame = F(window, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(StartPage)

    def show_frame(self, window):
        #Allows Program to switch windows/pages/frames
        frame = self.frames[window]
        frame.tkraise()

class StartPage(tk.Frame):
# Home Screen for Program
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        title = tk.Label(self, text="Participation Scores", font=LARGE_FONT)
        title.pack(pady=10, padx=10)

        btnPeriod1 = tk.Button(self, text="1st Period", fg="red",
                               command=lambda: controller.show_frame(ClassPart(controller, 1)))
        btnPeriod1.pack()


class ClassPart(tk.Frame):
# Screen showing students, participation buttons & their scores/Hogwarts houses    

    def __init__(self, parent, controller, period):
        tk.Frame.__init__(self, parent)

Но это выдает ошибку:

Traceback (most recent call last):
  File "/home/klucey/Documents/partvers2.py", line 307, in <module>
    window = part()
  File "/home/klucey/Documents/partvers2.py", line 40, in __init__
    frame = F(window, self)
TypeError: __init__() missing 1 required positional argument: 'period'

Любая помощь для начинающих / среднего уровня будет принята с благодарностью!

1 Ответ

0 голосов
/ 29 января 2020

Этот стандартный код, который вы (и, похоже, все остальные в SO) используете для обработки многостраничного приложения Tkinter, просто не подходит для обработки нескольких страниц одного и того же класса. Вам нужно было бы поместить несколько экземпляров ClassPart в список страниц и как-то договориться о том, чтобы им при создании было присвоено другой параметр period, но это нарушает метод .show_frame(), так как у вас больше нет уникального идентификатор для выбора страницы, которая будет отображаться.

Вот что я бы предложил вместо этого, учитывая, что у вас есть фиксированный набор страниц (это не очень хорошо работает с динамически генерируемыми страницами):

  • Избавьтесь от параметра period в вашем классе (чтобы его конструктор был совместим с другими страницами).
  • Создайте его подкласс для каждого периода:

    class ClassPart1(ClassPart):
        period = 1
    class ClassPart2(ClassPart):
        period = 2
    

    ... и так далее. Обратитесь к self.period в базовом классе для доступа к этому значению.

  • Измените начальное создание страницы l oop на for F in (StartPage, ClassPart1, ClassPart2, ClassPart3, ClassPart4, SettingsPage):. Используйте ClassPart1, et c. в качестве идентификатора для передачи на .show_frame().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...