python - 无法在循环中不断更改 tkinter 标签文本

标签 python loops for-loop tkinter range

我正在尝试制作简单的测验程序。我希望标签更改 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)))

最佳答案

您需要等待用户将答案输入到 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())

关于python - 无法在循环中不断更改 tkinter 标签文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40070475/

相关文章:

javascript 从 json 结果创建一个新数组

python - 如何以适合在 R 中分析的格式重新排列 pandas 中的表格?

python - 如何在for循环中创建数组?

java - 这个循环计算字符串中子字符串出现的次数,如何实现?

python - 循环时Python ArcPy模块中的"raise e Execute Error"

java - for循环中增量整数不会增加2

python - 从 netCDF 维度中减去值

python - Python逗号分隔列表

MYSQL游标循环,多跑一轮,为什么?

python - 创建具有相同键的字典列表?