<p>我知道你可能对重新开始不感兴趣,但下面是我如何实施这样一个计划的。脚本的主要入口点是<code>main</code>函数,它定义了一个“问题对象”(实际上只是字典)列表,描述所有问题及其相关答案。本例总共只有两个问题,每个问题有四个可能的答案。我们实例化<code>Application</code>类的一个实例,并运行它的<code>.mainloop()</code>来启动事件循环。应用程序实例用我们的问题列表初始化。它不直接跟踪问题列表,而是创建该列表的迭代器,以便我们以后可以使用<code>next</code>对问题进行迭代。整个程序以事件驱动的方式工作——首先,我们创建小部件并设置布局。然后,我们调用<code>goto_next_question</code>从问题迭代器中获取下一个问题,然后填充标签和按钮的文本。我们还更改了所有按钮的回调,这样只有一个按钮会引导我们进入下一个问题。当用户按下带有正确答案的按钮时,我们再次调用<code>goto_next_question</code>,并以这种方式继续,直到没有问题为止:</p>
<pre class="lang-python prettyprint-override"><code>import tkinter as tk
class Application(tk.Tk):
def __init__(self, questions, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.title("Questions")
self.geometry("256x128")
self.resizable(width=False, height=False)
self.grid_columnconfigure(0, weight=1)
self.grid_columnconfigure(1, weight=1)
self.grid_rowconfigure(0, weight=1)
self.grid_rowconfigure(1, weight=1)
self.grid_rowconfigure(2, weight=1)
self.questions = iter(questions)
self.question_label = tk.Label(self, text="hello world" * 3, borderwidth=2, relief="ridge")
self.question_label.grid(row=0, column=0, columnspan=2)
self.default_button_color = tk.Button().cget("bg")
self.buttons = []
for y in range(2):
for x in range(2):
button = tk.Button(self, text="123")
button.grid(row=y+1, column=x, sticky=tk.N + tk.S + tk.E + tk.W)
self.buttons.append(button)
self.goto_next_question()
def goto_next_question(self):
from random import shuffle
question = next(self.questions, None)
if question is None:
self.destroy()
return
shuffle(question["answers"])
self.question_label["text"] = question["text"]
for button, answer in zip(self.buttons, question["answers"]):
button["text"] = answer["text"]
button["bg"] = self.default_button_color
if answer["isCorrect"]:
button["command"] = self.goto_next_question
else:
button["command"] = lambda button=button: self.answered_wrong(button)
def answered_wrong(self, button):
from tkinter.messagebox import showerror
button["bg"] = "red"
showerror(message="Wrong!")
def main():
questions = [
{
"text": "What is the capitol of Switzerland?",
"answers": [
{
"text": "Bern",
"isCorrect": True
},
{
"text": "Zürich",
"isCorrect": False
},
{
"text": "Lucerne",
"isCorrect": False
},
{
"text": "Geneva",
"isCorrect": False
}
]
},
{
"text": "What is the height of Mount Everest?",
"answers": [
{
"text": "8,849m",
"isCorrect": True
},
{
"text": "7,994m",
"isCorrect": False
},
{
"text": "4,021m",
"isCorrect": False
},
{
"text": "10,119m",
"isCorrect": False
}
]
}
]
application = Application(questions)
application.mainloop()
return 0
if __name__ == "__main__":
import sys
sys.exit(main())
</code></pre>
<p><a href="https://i.stack.imgur.com/9LOVj.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/9LOVj.png" alt=""/></a></p>