#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()
Комментарии:
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 страницы. Вы можете проверить это руководство для лучшего понимания классов