我正在尝试制作简单的测验程序。我希望标签能够针对10个问题范围内的每个问题更改文本。因此,当您在第一个问题上时,一个标签应显示“问题1”。但它立即显示“问题10”,我无法进行测验。
在词典中,只有一个问题,但它不应该是问题,它应该重复这个问题10次。
这是我的代码片段(它在课堂上):
self.label = tk.Label(self, text="This is page 1")
self.label.pack(side="top", fill="x", pady=10)
self.label1 = tk.Label(self, text='')
self.label1.pack()
self.label2 = tk.Label(self, text='')
self.label2.pack()
self.entry1 = tk.Entry(self)
self.entry1.pack()
self.label3 = tk.Label(self, text='')
self.label3.pack()
self.entry2 = tk.Entry(self)
self.entry2.pack()
my_dict = {
"Base-2 number system": "binary",
}
score = 0
for i in range(10):
question = (random.choice(list(my_dict.keys())))
answer = my_dict[question]
self.label1.config(text=("Question " + str(i + 1)))
self.label2.config(text=(question + "?"))
guess = self.entry1.get()
if guess.lower() == answer.lower():
score += 1
else:
score += 0
self.label3.config(text=("Your final score was " + str(score)))
答案 0 :(得分:1)
您需要等待用户在Entry小部件中输入他们的答案。您发布的代码不会这样做。与命令行程序相比,您必须在GUI程序中组织逻辑略有不同,因为您需要等待用户操作生成的事件然后对它们做出响应。
下面的代码并不能满足您的所有需求,但确实可以运行。 :)它显示一个问题,等待用户在self.entry1
窗口小部件中键入他们的答案,当他们点击该窗口小部件中的Enter
键时,它会调用处理他们的.get_answer
方法回答然后调用.ask
方法来提出新问题。在10个问题之后,程序退出。
import tkinter as tk
import random
class Quiz(tk.Frame):
def __init__(self, root):
super().__init__(root)
self.root = root
self.pack()
self.label = tk.Label(self, text="This is page 1")
self.label.pack(side="top", fill="x", pady=10)
self.label1 = tk.Label(self, text='')
self.label1.pack()
self.label2 = tk.Label(self, text='')
self.label2.pack()
self.entry1 = tk.Entry(self)
self.entry1.bind("<Return>", self.get_answer)
self.entry1.pack()
self.label3 = tk.Label(self, text='')
self.label3.pack()
self.entry2 = tk.Entry(self)
self.entry2.pack()
self.start_quiz()
root.mainloop()
def start_quiz(self):
self.qdict = {
"Base-2 number system": "binary",
"Base-8 number system": "octal",
"Base-16 number system": "hexadecimal",
}
self.qkeys = list(self.qdict.keys())
self.score = 0
self.count = 1
self.ask()
def ask(self):
self.question = random.choice(self.qkeys)
self.label1.config(text="Question {}".format(self.count))
self.label2.config(text=self.question + "?")
def get_answer(self, event):
widget = event.widget
guess = widget.get()
answer = self.qdict[self.question]
if guess.lower() == answer.lower():
self.score += 1
self.label3.config(text="Score: {}".format(self.score))
self.count += 1
if self.count <= 10:
self.ask()
else:
self.root.destroy()
Quiz(tk.Tk())