You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Turtle芝加哥Kahoot式测验:选项文本持续显示问题求助

测验选项文本无法持续显示的问题修复

问题场景

开发芝加哥主题的Kahoot!风格测验项目时,出现选项文本仅在点击按钮时短暂显示后消失的问题,需要让选项文本始终可见。

原代码

from turtle import Screen, Turtle

# Define the quiz questions, options, and answers
quiz_questions = [
    {
        "question": "Which type of crime is most committed in Chicago?",
        "options": ["A. Burglary", "B. Theft", "C. Assault", "D. Vandalism"],
        "answer": "B"
    },
    {
        "question": "What is considered the most popular sport in Chicago according to recent surveys?",
        "options": ["A. Football", "B. Basketball", "C. Baseball", "D. Hockey"],
        "answer": "C"
    },
    {
        "question": "According to public opinion surveys, which public park in Chicago is the most visited?",
        "options": ["A. Lincoln Park", "B. Grant Park", "C. Public Transit", "D. Millenium Park"],
        "answer": "D"
    },
    {
        "question": "What mode of transportation do most Chicagoans prefer for commuting, based on city transportation surveys?",
        "options": ["A. Car", "B. Bicycle", "C. Public Transit", "D. Walking"],
        "answer": "C"
    },
    {
        "question": "Which neighborhood is commonly perceived as the culinary hotspot of Chicago, as per local food surveys?",
        "options": ["A. West Loop", "B. River North", "C. Noise Pollution", "D. Waste Management"],
        "answer": "A"
    },
    {
        "question": "Based on environmental surveys, what is Chicago's biggest environmental concern?",
        "options": ["A. Water Pollution", "B. Air Pollution", "C. Wicker Park", "D. Lincoln Square"],
        "answer": "B"
    },
    {
        "question": "What is the most attended annual event in Chicago, according to event attendance records?",
        "options": ["A. Chicago Marathon", "B. The Taste of Chicago", "C. Lollapalooza", "D. Chicago Auto Show"],
        "answer": "B"
    },
    {
        "question": "Which Chicago museum is rated the highest in visitor satisfaction surveys?",
        "options": ["A. Museum of Science and Industry", "B. Field Museum", "C. The Art Institute of Chicago", "D. Chicago History Museum"],
        "answer": "C"
    },
    {
        "question": "What is the most commonly spoken language in Chicago after English, according to demographic surveys?",
        "options": ["A. Hindi", "B. Chinese", "C. Spanish", "D. Vietnamese"],
        "answer": "C"
    },
    {
        "question": f"Based on urban development surveys, what is Chicago's most \nrapidly growing neighborhood in terms of new construction and business openings?",
        "options": ["A. Lincoln Park", "B. Fulton Market", "C. Hyde Park", "D. Logan Square"],
        "answer": "B"
    }
]

# Initialize the screen
screen = Screen()
screen.setup(width=1.0, height=1.0)
screen.bgcolor('white')

# Create turtles for the question, options, score, and timer
question_turtle = Turtle()
question_turtle.hideturtle()
question_turtle.penup()
question_turtle.goto(0, 250)
question_turtle.color('black')

option_turtles = []
option_texts = []  # List to hold the text turtles
option_colors = ['red', 'black', 'blue', 'green']
for i in range(4):
    option_turtle = Turtle(shape='square')
    option_turtle.penup()
    option_turtle.shapesize(stretch_wid=5, stretch_len=20)  # Larger buttons
    option_turtle.color(option_colors[i])
    option_turtle.goto(0, 150 - i * 120)  # Adjust the position
    
    # Create a turtle for the option text
    text_turtle = Turtle()
    text_turtle.hideturtle()
    text_turtle.penup()
    text_turtle.goto(option_turtle.xcor(), option_turtle.ycor() - 20)
    text_turtle.color('white')  # White text color
    
    option_turtles.append(option_turtle)
    option_texts.append(text_turtle)  # Add to the list of text turtles

score_turtle = Turtle()
score_turtle.hideturtle()
score_turtle.penup()
score_turtle.goto(200, 330)
score_turtle.color('black')

timer_turtle = Turtle()
timer_turtle.hideturtle()
timer_turtle.penup()
timer_turtle.goto(-200, 330)
timer_turtle.color('purple')

# Draw timer circle
timer_circle = Turtle()
timer_circle.hideturtle()
timer_circle.penup()
timer_circle.color('purple')
timer_circle.goto(-200, 220)
timer_circle.shape('circle')
timer_circle.shapesize(stretch_wid=3, stretch_len=3)  # Adjust size as needed


def draw_question(question_number, question, options):
    question_turtle.clear()
    for i, option_turtle in enumerate(option_turtles):
        option_turtle.showturtle()

        # Clear the old text and write the new one
        option_texts[i].clear()
        option_texts[i].write(quiz_questions[current_question_index[0]-1]['options'][i], align="center", font=("Arial", 14, "bold"))

    question_turtle.write(f"Question {question_number}: {question}", align="center", font=("Arial", 18, "normal"))

def show_score(score):
    score_turtle.clear()
    score_turtle.write(f"Score: {score}/10", align="center", font=("Arial", 18, "normal"))

def show_timer(time_left):
    timer_turtle.clear()
    timer_turtle.write(f"Time: {time_left}s", align="center", font=("Arial", 18, "normal"))

def handle_option_click(x, y, answer, correct_answer, callback):
    if answer == correct_answer:
        score[0] += 1  # Increment score if answer is correct
    show_score(score[0])
    callback()  # Call the callback function to proceed to the next question
    # Redraw text immediately after handling click
    draw_current_options()

def draw_current_options():
    for i in range(4):
        option_texts[i].clear()
        if current_question_index[0] < len(quiz_questions):  # Ensure index is within bounds
            option_texts[i].write(quiz_questions[current_question_index[0]]['options'][i], align="center", font=("Arial", 16, "bold"))

current_question_index = 0

def setup_question(question_info):
    current_question_index[0] += 1  # Increment question index
    correct_answer = question_info['answer']
    for i, option_turtle in enumerate(option_turtles):
        option_turtle.onclick(lambda x, y, a=chr(65+i), ca=correct_answer: handle_option_click(x, y, a, ca, next_question))
    draw_question(current_question_index[0], question_info['question'], question_info['options'])

def next_question():
    if quiz_questions and current_question_index[0] < len(quiz_questions):
        question_info = quiz_questions[current_question_index[0]]
        setup_question(question_info)
    else:
        finish_quiz()

def update_timer():
    if time_elapsed[0] < 100:
        time_elapsed[0] += 1
        show_timer(100 - time_elapsed[0])
        screen.ontimer(update_timer, 1000)
    else:
        finish_quiz()

def finish_quiz():
    question_turtle.goto(0, 0)
    question_turtle.write("Quiz Over! Final Score: {}/10".format(score[0]), align="center", font=("Arial", 24, "bold"))
    for option_turtle in option_turtles:
        option_turtle.hideturtle()

score = [0]
time_elapsed = [0]  # Timer counter
current_question_index = [0]  # Track current question number

# Show initial score
show_score(score[0])  # Initialize score display
show_timer(100 - time_elapsed[0])

if quiz_questions:
    next_question()  # Start the quiz
    update_timer()  # Start the timer

screen.mainloop()

问题根源

  1. draw_question函数索引错误:函数中通过quiz_questions[current_question_index[0]-1]['options'][i]获取选项文本,依赖外部变量索引,容易因current_question_index的更新导致错位,且未直接使用传入的options参数,逻辑冗余。
  2. 多余的draw_current_options调用:handle_option_click中调用callback()后又执行draw_current_options(),此时current_question_index已更新,该函数索引逻辑错误,会错误清除并覆盖刚渲染的下一题文本。
  3. draw_current_options索引逻辑错误:函数中用current_question_index[0]直接访问quiz_questions,但current_question_index从1开始计数,quiz_questions是0索引数组,导致取到错误选项内容。

修复方案

  • 修正draw_question函数,直接使用传入的options参数渲染选项文本,避免依赖外部索引。
  • 删除handle_option_click中多余的draw_current_options()调用,让next_question负责正确渲染下一题内容。
  • 移除无用的draw_current_options函数,简化逻辑。

修改后的代码

from turtle import Screen, Turtle

# 定义测验题目、选项和答案
quiz_questions = [
    {
        "question": "芝加哥最常见的犯罪类型是什么?",
        "options": ["A. 入室盗窃", "B. 盗窃", "C. 袭击", "D. 故意破坏"],
        "answer": "B"
    },
    {
        "question": "根据近期调查,芝加哥最受欢迎的运动是什么?",
        "options": ["A. 橄榄球", "B. 篮球", "C. 棒球", "D. 冰球"],
        "answer": "C"
    },
    {
        "question": "根据民意调查,芝加哥访问量最高的公园是哪个?",
        "options": ["A. 林肯公园", "B. 格兰特公园", "C. 公共交通", "D. 千禧公园"],
        "answer": "D"
    },
    {
        "question": "根据城市交通调查,芝加哥人通勤最偏好的交通方式是什么?",
        "options": ["A. 汽车", "B. 自行车", "C. 公共交通", "D. 步行"],
        "answer": "C"
    },
    {
        "question": "根据当地美食调查,芝加哥哪个街区被认为是美食热点?",
        "options": ["A. 西环路", "B. 河北区", "C. 噪音污染", "D. 废物管理"],
        "answer": "A"
    },
    {
        "question": "根据环境调查,芝加哥最大的环境问题是什么?",
        "options": ["A. 水污染", "B. 空气污染", "C. 柳条公园", "D. 林肯广场"],
        "answer": "B"
    },
    {
        "question": "根据活动参与记录,芝加哥参与人数最多的年度活动是什么?",
        "options": ["A. 芝加哥马拉松", "B. 芝加哥美食节", "C. Lollapalooza音乐节", "D. 芝加哥车展"],
        "answer": "B"
    },
    {
        "question": "根据游客满意度调查,芝加哥评分最高的博物馆是哪个?",
        "options": ["A. 科学与工业博物馆", "B. 菲尔德博物馆", "C. 芝加哥艺术学院", "D. 芝加哥历史博物馆"],
        "answer": "C"
    },
    {
        "question": "根据人口统计调查,芝加哥除英语外最常用的语言是什么?",
        "options": ["A. 印地语", "B. 中文", "C. 西班牙语", "D. 越南语"],
        "answer": "C"
    },
    {
        "question": "根据城市发展调查,芝加哥在新建筑和商业开业方面增长最快的街区是哪个?",
        "options": ["A. 林肯公园", "B. 富尔顿市场", "C. 海德公园", "D. 洛根广场"],
        "answer": "B"
    }
]

# 初始化屏幕
screen = Screen()
screen.setup(width=1.0, height=1.0)
screen.bgcolor('white')

# 创建用于显示题目、选项、分数和计时器的海龟对象
question_turtle = Turtle()
question_turtle.hideturtle()
question_turtle.penup()
question_turtle.goto(0, 250)
question_turtle.color('black')

option_turtles = []
option_texts = []  # 存储选项文本的海龟列表
option_colors = ['red', 'black', 'blue', 'green']
for i in range(4):
    option_turtle = Turtle(shape='square')
    option_turtle.penup()
    option_turtle.shapesize(stretch_wid=5, stretch_len=20)  # 放大按钮
    option_turtle.color(option_colors[i])
    option_turtle.goto(0, 150 - i * 120)  # 调整位置
    
    # 创建选项文本的海龟
    text_turtle = Turtle()
    text_turtle.hideturtle()
    text_turtle.penup()
    text_turtle.goto(option_turtle.xcor(), option_turtle.ycor() - 20)
    text_turtle.color('white')  # 白色文本
    
    option_turtles.append(option_turtle)
    option_texts.append(text_turtle)

score_turtle = Turtle()
score_turtle.hideturtle()
score_turtle.penup()
score_turtle.goto(200, 330)
score_turtle.color('black')

timer_turtle = Turtle()
timer_turtle.hideturtle()
timer_turtle.penup()
timer_turtle.goto(-200, 330)
timer_turtle.color('purple')

# 绘制计时器圆圈
timer_circle = Turtle()
timer_circle.hideturtle()
timer_circle.penup()
timer_circle.color('purple')
timer_circle.goto(-200, 220)
timer_circle.shape('circle')
timer_circle.shapesize(stretch_wid=3, stretch_len=3)  # 调整大小


def draw_question(question_number, question, options):
    question_turtle.clear()
    for i in range(len(options)):
        option_turtles[i].showturtle()
        # 清除旧文本并写入新文本
        option_texts[i].clear()
        option_texts[i].write(options[i], align="center", font=("Arial", 14, "bold"))

    question_turtle.write(f"第 {question_number} 题: {question}", align="center", font=("Arial", 18, "normal"))

def show_score(score):
    score_turtle.clear()
    score_turtle.write(f"得分: {score}/10", align="center", font=("Arial", 18, "normal"))

def show_timer(time_left):
    timer_turtle.clear()
    timer_turtle.write(f"剩余时间: {time_left}秒", align="center", font=("Arial", 18, "normal"))

def handle_option_click(x, y, answer, correct_answer, callback):
    if answer == correct_answer:
        score[0] += 1  # 答对加分
    show_score(score[0])
    callback()  # 调用回调函数进入下一题

def setup_question(question_info):
    current_question_index[0] += 1  # 增加题目索引
    correct_answer = question_info['answer']
    for i in range(len(option_turtles)):
        option_turtles[i].onclick(lambda x, y, a=chr(65+i), ca=correct_answer: handle_option_click(x, y, a, ca, next_question))
    draw_question(current_question_index[0], question_info['question'], question_info['options'])

def next_question():
    if quiz_questions and current_question_index[0] < len(quiz_questions):
        question_info = quiz_questions[current_question_index[0]]
        setup_question(question_info)
    else:
        finish_quiz()

def update_timer():
    if time_elapsed[0] < 100:
        time_elapsed[0] += 1
        show_timer(100 - time_elapsed[0])
        screen.ontimer(update_timer, 10
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 00:05:28