Python结合Kivy开发密码生成器GUI点击生成按钮无内容更新求助
代码问题修复说明
你代码存在3处核心错误,修改后即可正常运行:
- 同步网络请求阻塞主线程导致卡顿,且重复请求词库冗余
- 错误地在实例方法中动态声明StringProperty,未正确修改已绑定的密码属性
- 点击回调逻辑错误,未更新UI绑定变量,仅返回无意义的布尔判断
修复后的Python代码
import kivy from kivy.app import App from kivy.uix.widget import Widget from kivy.properties import StringProperty from kivy.properties import ObjectProperty import requests import random import threading class float_layout(Widget): passw = ObjectProperty(None) btn = ObjectProperty(None) password = StringProperty("") # 预加载词库,只请求一次 WORDS = [] def __init__(self, **kwargs): super().__init__(**kwargs) # 初始化时异步加载词库,避免启动卡顿 threading.Thread(target=self._load_word_list, daemon=True).start() def _load_word_list(self): word_site = "https://www.mit.edu/~ecprice/wordlist.10000" response = requests.get(word_site) self.WORDS = response.content.splitlines() def change(self): # 词库没加载完先提示 if not self.WORDS: self.password = "词库加载中,请稍候再试" return signs = ["__","_","**",":","::",";",";;","&","&&","***","-","--","---","***","&&&"] sign = random.choice(signs) # 修正索引范围,避免越界 number = random.randint(0, len(self.WORDS)-1) addition1 = random.randint(0,100000) word = self.WORDS[number].decode('utf-8') + sign + str(addition1) # 直接修改绑定的StringProperty属性,触发UI自动更新 self.password = word class GenApp(App): def build(self): return float_layout() if __name__ == "__main__": GenApp().run()
需修改的KV代码部分
仅需要调整按钮的点击回调,不需要传多余参数:
# 其他部分保持不变,仅修改Button的on_press属性 Button: id:btn text:"Generate" size_hint:0.5,0.1 pos_hint:{"x":0.25,"top":0.41} background_color:0.3, 0.5, 0.7, 1 on_press: root.change()
修改说明
- 新增异步线程加载词库,仅在应用启动时请求一次,不会阻塞UI线程,点击按钮不会再卡顿
- 废弃了方法内错误的StringProperty声明逻辑,直接修改实例已定义的
password属性,Kivy会自动同步更新绑定的TextInput文本 - 修正了随机数索引范围,避免词库索引越界报错
- 简化了点击回调逻辑,删除无意义的参数传递和返回值
内容的提问来源于stack exchange,提问作者gtam18
相关产品推荐
相关产品推荐

