Не удается обновить оценку при использовании Tkinter

#python #tkinter

#python #tkinter

Вопрос:

Я пытаюсь создать небольшую викторину на Tkinter, и я не могу корректно обновить оценку при нажатии кнопки. Вместо того, чтобы показывать 500, он показывает 0 и не «активирует» функцию, которая обновляет оценку. Как мне правильно отобразить оценку при нажатии кнопки?

 score = 0
class SampleApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self._frame = None
        self.switch_frame(MainMenu)

    def switch_frame(self, frame_class):
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.pack()


class MainMenu(tk.Frame):
    def __init__(self, master):
        #Maths Picture/Button
        global photo
        tk.Frame.__init__(self, master)
        photo = PhotoImage(file = "MathsPicture.png")
        photoimage = photo.subsample(3,3)
        tk.Label(self, text="MainMenu", font=('Verdana', 18, "bold")).pack(side="top", fill="x", pady=5)
        tk.Button(self, image = photo, command=lambda: master.switch_frame(PageOne)).pack(side="left")
        tk.Button(self, text="Go to page two",command=lambda:[master.switch_frame(PageTwo), event()]).pack()
        
def event(event=None):
    global score
    score  = 500
    print(score)
    

class PageOne(tk.Frame):
    global score
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        tk.Frame.configure(self,bg='blue')
        tk.Label(self, text="Page one", font=('Helvetica', 18, "bold")).pack(side="top", fill="x", pady=5)
        tk.Label(self, text=score , font=("Verdana", 18, "bold")).pack(side="bottom")
        tk.Button(self, text="Go back to start page",
                  command=lambda: master.switch_frame(MainMenu)).pack()

class PageTwo(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        tk.Frame.configure(self,bg='red')
        tk.Label(self, text="Page two", font=('Helvetica', 18, "bold")).pack(side="top", fill="x", pady=5)
        tk.Button(self, text="Go back to start page",
                  command=lambda: master.switch_frame(MainMenu)).pack()

if __name__ == "__main__":
    window = SampleApp()
    window.geometry("800x800")
    window.mainloop()
  

окно tkinter

Комментарии:

1. text = Score означает, что вы указываете саму функцию как текст, который будет отображаться, а не результат фактического вызова функции. Это было бы text = Score() , хотя это тоже не принесло бы ничего полезного, поскольку функция ничего не возвращает.

2. В дополнение к приведенному выше ответу, если вы хотите обновить глобальную переменную score внутри вызываемой функции Score , которую вы должны использовать global Score в начале функции.

3. Ваш текущий пример кода здесь, похоже, работает нормально, как только я добавил импорт вверху. Нажав на изображение, оно переходит на страницу 1, чтобы отобразить оценку, а когда вы нажимаете кнопку goto page2 на главной странице, оно добавляет оценку. Это решено?

Ответ №1:

во-первых, функция Score() ничего не возвращает

самым простым решением было бы сделать оценку глобальной переменной и при возникновении события делать

 score  = 500
  

это то же самое, что score = score 500
и текст, просто сделайте score , какая переменная, и вы должны сделать ее глобальной

Отредактированный код:

 score = 0
class SampleApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self._frame = None
        self.switch_frame(MainMenu)

    def switch_frame(self, frame_class):
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.pack()


class MainMenu(tk.Frame):
    def __init__(self, master):
        #Maths Picture/Button
        global photo
        tk.Frame.__init__(self, master)
        photo = PhotoImage(file = "MathsPicture.png")
        photoimage = photo.subsample(3,3)
        tk.Label(self, text="MainMenu", font=('Verdana', 18, "bold")).pack(side="top", fill="x", pady=5)
        tk.Button(self, image = photo, command=lambda: master.switch_frame(PageOne)).pack(side="left")
        tk.Button(self, text="Go to page two",command=lambda:[master.switch_frame(PageTwo), Score()]).pack()
        
def event(event=None):
    global score
    score  = 500
    # asign this function to a button or sth

class PageOne(tk.Frame):
    global score
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        tk.Frame.configure(self,bg='blue')
        tk.Label(self, text="Page one", font=('Helvetica', 18, "bold")).pack(side="top", fill="x", pady=5)
        tk.Label(self, text=score , font=("Verdana", 18, "bold")).pack(side="bottom")
        tk.Button(self, text="Go back to start page",
                  command=lambda: master.switch_frame(MainMenu)).pack()
        tk.Button(self, text='Update score', command=event)

class PageTwo(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        tk.Frame.configure(self,bg='red')
        tk.Label(self, text="Page two", font=('Helvetica', 18, "bold")).pack(side="top", fill="x", pady=5)
        tk.Button(self, text="Go back to start page",
                  command=lambda: master.switch_frame(MainMenu)).pack()
        tk.Button(self, text='Update score', command=event)
  

Комментарии:

1. Я обновил код, но оценка по-прежнему не обновляется. Вопрос был обновлен, чтобы показать новый код и проблему

2. вам нужно иметь привязку кнопки или события, которая будет выполнять event(). Я немного изменил свой код, попробуйте сейчас. Также, как я заметил, вы можете создать, например, только один класс -> Window, а затем создать 2 экземпляра этого класса, чтобы создать 2 страницы

3. Также, как я заметил, вы можете создать только один класс -> Window, например, а затем создать 2 экземпляра этого класса, чтобы сделать 2 страницы. Вы можете проверить это руководство для лучшего понимания классов