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()
问题根源
draw_question函数索引错误:函数中通过quiz_questions[current_question_index[0]-1]['options'][i]获取选项文本,依赖外部变量索引,容易因current_question_index的更新导致错位,且未直接使用传入的options参数,逻辑冗余。- 多余的
draw_current_options调用:handle_option_click中调用callback()后又执行draw_current_options(),此时current_question_index已更新,该函数索引逻辑错误,会错误清除并覆盖刚渲染的下一题文本。 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
相关产品推荐
相关产品推荐

