python - 在 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()
解决方案
您在初始化应用程序时初始化 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')
推荐阅读
- android - 我可以使用 FileProvider 访问 android 的“/system”、“/data”和“/mnt”吗?如果是这样,怎么做?
- android - 无法解决:com.github.Q42:AndroidScrollingImageView:1.3.2 错误
- swift - 快速函数 () -> (Int) -> 字符串
- javascript - 无法从 webpack 包中导入 ES6 模块
- php - 这是旧的 php 语法吗
- qt - 如何使 QLabel 的文本与某个变量“连接”,因此一旦变量更改,文本就会更新?
- python - Deepcopy 导致“类”没有属性“大小”
- jersey - Jersey JAX-RS REST“getter”方法总是被调用
- design-patterns - 享元模式困境
- android - 错误:修复版本冲突(google play services)Kotlin