Добавление в счетчик для каждого кадра для викторины в python tkinter?

Поэтому я упростил свой код до основы, чтобы попытаться заставить это работать. Основная страница, на которую вы нажимаете «играть», выводит вас на страницу «MathsQ1», это первый вопрос. На странице есть вопрос и четыре кнопки, одна из которых является правой кнопкой. Я смог сделать две разные команды для правильных и неправильных кнопок, которые отведут вас к следующему вопросу. Но также я хочу, чтобы правильная функция добавляла 1 к счетчику, который называется «правильным». После того, как вы закончите последний вопрос, вы получите страницу «MathsEnd», которая затем отобразит ваш счет как «поздравляю вас (правильно) / 2», и я был бы очень признателен, если бы кто-то сказал мне, что я делаю неправильно. Благодарю.

Код:

import tkinter as tk
from tkinter import ttk

#INITIALIZING
class MegaQuiz(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        tk.Tk.wm_title(self, "THE MEGA POP QUIZ")
        self.geometry("930x2000")
        self.highlightbackground="#FF846B"

        self.correct = 0

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

        self.frames = {}
        for F in (MainPage, MathsQ1, MathsQ2, MathsEnd):
            page_name = F.__name__
            frame = F(parent=container, controller=self)
            self.frames[page_name] = frame
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame("MainPage")

    def show_frame(self, page_name):
        frame = self.frames[page_name]
        frame.tkraise()

class MainPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        self.configure(background="#FFC2B5")


        #Play BUTTON
        tk.Button(self, text="PLAY", width=10, 
                        command = lambda: controller.show_frame("MathsQ1")) .grid(column=1, row=11, columnspan=8, pady=20, sticky="nesw")

class MathsQ1(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        self.configure(background="#FFC2B5")

        tk.Label(self, text="Maths Quiz") .grid(column=2, row=0)

        tk.Label(self, text="Question 1") .grid(column=4, row=1, columnspan=5, sticky="nesw")

        tk.Button(self, text="wrong",
                  command=self.wrong) .grid(column=4, row=3, sticky="nesw")
        tk.Button(self, text="right",
                  command=self.right) .grid(column=4, row=5, sticky="nesw")
        tk.Button(self, text="wrong",
                  command=self.wrong) .grid(column=6, row=3, sticky="nesw")
        tk.Button(self, text="wrong",
                  command=self.wrong) .grid(column=6, row=5, sticky="nesw")

    def wrong(self):
        self.controller.show_frame("MathsQ2")

    def right(self):
        self.controller.show_frame("MathsQ2")

        self.controller.correct = self.controller.correct + 1

class MathsQ2(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        self.configure(background="#FFC2B5")

        tk.Label(self, text="Maths Quiz") .grid(column=2, row=0)

        tk.Label(self, text="Question 2") .grid(column=4, row=1, columnspan=5, sticky="nesw")

        tk.Button(self, text="wrong",
                  command=self.wrong) .grid(column=4, row=3, sticky="nesw")
        tk.Button(self, text="right",
                  command=self.right) .grid(column=4, row=5, sticky="nesw")
        tk.Button(self, text="wrong",
                  command=self.wrong) .grid(column=6, row=3, sticky="nesw")
        tk.Button(self, text="wrong",
                  command=self.wrong) .grid(column=6, row=5, sticky="nesw")

    def wrong(self):
        self.controller.show_frame("MathsEnd")

    def right(self):
        self.controller.show_frame("MathsEnd")

        self.controller.correct = self.controller.correct + 1

class MathsEnd(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        self.configure(background="#FFC2B5")

        tk.Label(self, text=("congrats you got " + str(self.controller.correct) + "/2")) .grid(column=1, row=1)

        tk.Button(self, text="Back To Home",
                            command = lambda: controller.show_frame("MainPage")) .grid(column=6, row=10, sticky="nesw", pady=10)


#RUNNING PROGRAM
app = MegaQuiz()

app.mainloop()

python,function,class,tkinter,counter,

-1

Ответов: 1


0 принят

Вы инициализируете MathsEnd, когда вы инициализируете приложение, поэтому метка, на которой отображается оценка, использует значение controller.correct в начале программы, то есть 0. Вам нужно создать метод в вашем классе MathsEnd, который обновляет метку:

class MathsEnd(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        self.configure(background="#FFC2B5")

        # create label, pack seperately so it can be configured later
        self.score = tk.Label(self)
        self.score.grid(column=1, row=1)
        # initalise using method
        self.update_label()

        tk.Button(self, text="Back To Home",
                        command = lambda: controller.show_frame("MainPage")) 
        .grid(column=6, row=10, sticky="nesw", pady=10)

    # new method to update label contents
    def update_label(self):
        self.score.config(text='Congrats you got %s/2' % self.controller.correct)

(Я должен был внести некоторые изменения в то, как вы также создаете ярлык).

Затем вам необходимо вызвать этот метод, чтобы обновить счет, когда он будет изменен.

def right(self):
    self.controller.correct += 1
    # update score label
    self.controller.frames['MathsEnd'].update_label()

    self.controller.show_frame('MathsQ2')
Python, функция, класс, Tkinter, счетчик,
Похожие вопросы