Kivy/Python中random.choice放在哪可重启重选且全代码访问一致
解决方案
你遇到的问题核心是全局变量仅在程序初始化时生成一次,且没有在实例层面存储当前使用的单词,只需两步即可解决:
- 去掉全局
word变量,改用实例属性self.current_word存储当前轮次使用的单词,每次重启时重新为该属性赋值 - 把重复的UI渲染逻辑抽成公共方法,避免冗余代码,提交逻辑里直接读取
self.current_word即可保证顶部展示和提交后显示的单词完全一致
修改后完整代码
import random from kivy.uix.gridlayout import GridLayout from kivy.uix.label import Label from kivy.uix.textinput import TextInput from kivy.uix.button import Button # 此处替换为你实际从文本文件读取得到的单词列表 words = [] class Mygridlayout(GridLayout): def __init__(self, **kwargs): super(Mygridlayout, self).__init__(**kwargs) self.cols = 1 # 初始化时生成第一个单词 self.current_word = random.choice(words) # 调用公共方法渲染UI self.build_ui() def build_ui(self): """公共UI渲染逻辑,避免__init__和restart重复写代码""" self.clear_widgets() self.Top_Grid = GridLayout() self.Top_Grid.cols = 2 self.add_widget(self.Top_Grid) # 读取实例属性存储的当前单词展示 self.Top_Grid.add_widget(Label(text=self.current_word)) self.definition = TextInput(multiline=True) self.Top_Grid.add_widget(self.definition) self.submit = Button(text='submit') self.submit.bind(on_press=self.press) self.add_widget(self.submit) def press(self, instance): """提交按钮逻辑,读取同一个实例属性保证单词一致""" self.clear_widgets() # 结果展示用self.current_word,和顶部展示的完全相同 self.add_widget(Label(text=f"{self.current_word} defined as: {self.definition.text}")) # 添加重启按钮 self.restart_btn = Button(text='restart') self.restart_btn.bind(on_press=self.restart) self.add_widget(self.restart_btn) def restart (self, instance): # 重启时先随机生成新单词 self.current_word = random.choice(words) # 重新渲染UI self.build_ui()
修改后每一轮的单词都存储在实例的current_word属性里,顶部标签和提交后的提示文本读取的是同一个值,不会出现不一致问题;每次点击重启按钮时都会重新随机选取单词,不会再出现重复单词的问题。
内容的提问来源于stack exchange,提问作者Tooluser
相关产品推荐
相关产品推荐

