Kivy开发英语学习应用 如何实现循环出题持续校验功能
Kivy英语学习应用连续出题实现方案
- 不要使用while循环实现需求:Kivy是事件驱动GUI框架,手写无限while会阻塞Kivy自身的主事件循环,直接导致应用卡死无响应。你只需要在每次答案校验完成后,主动调用出题逻辑刷新题目即可。
- 原代码只能校验一次的核心问题:随机索引
rand是全局变量,程序启动时仅生成一次,全程不会更新,也没有后续刷新题目的逻辑。
完整修改后代码
from kivy.app import App from kivy.uix.gridlayout import GridLayout from kivy.uix.label import Label from kivy.uix.image import Image from kivy.uix.button import Button from kivy.uix.textinput import TextInput from random import randrange from kivy.clock import Clock # 导入时钟调度工具,用于延迟刷新题目 # 动词和对应过去式 verbs = ["arise", "awake", "be", "bear", "beat", "become", "begin", "bend", "bet", "bind", "bite", "bleed", "blow", "break", "breed", "bring", "broadcast", "build", "burn", "burst"] answers =["arose", "awoke", "was", "bore", "beat", "became", "began", "bent", "bet", "bound", "bit", "bled", "blew", "broke", "bred", "brought", "broadcast", "built", "burnt", "burst"] vocab_count = 20 # 不要用range作为变量名,会覆盖Python内置range函数 class english_learning(App): # 新增:生成新题目的方法 def generate_new_question(self, dt=None): self.current_rand = randrange(0, vocab_count) # 随机索引改为实例属性 self.greeting.text = verbs[self.current_rand] self.answer.text = "" # 清空上一题的输入 def build(self): self.window = GridLayout() self.window.cols = 1 self.window.add_widget(Image(source='cat.png')) self.greeting = Label() self.window.add_widget(self.greeting) self.answer = TextInput(multiline=False) self.window.add_widget(self.answer) self.button = Button(text="check") self.button.bind(on_press=self.check_answer) self.window.add_widget(self.button) self.generate_new_question() # 初始化生成第一道题 return self.window def check_answer(self, instance): if self.answer.text == answers[self.current_rand]: self.greeting.text = f'yes! {self.answer.text} is the correct verb' else: self.greeting.text = "no!" # 校验完成后延迟1秒刷新下一题,方便用户看到对错提示 Clock.schedule_once(self.generate_new_question, 1) if __name__ == "__main__": english_learning().run()
核心修改说明
- 新增
generate_new_question实例方法,统一处理生成随机索引、更新题干、清空输入的逻辑,后续需要刷新题目直接调用该方法即可 - 把原来的全局随机索引改为实例属性
current_rand,每次生成新题目时都会更新 - 修正了原代码中用
range作为变量名覆盖Python内置函数的问题 - 答案校验完成后通过
Clock.schedule_once延迟1秒刷新题目,如果不需要延迟可以直接调用self.generate_new_question()
内容的提问来源于stack exchange,提问作者erramidev
相关产品推荐
相关产品推荐

