Kivy Python开发:Logo动画结束未切屏、图片加载失败等问题求助
Kivy应用问题修复:Logo加载、页面跳转与属性报错
问题梳理
开发Kivy应用时遇到两类问题:
- 初始阶段加载logo逐帧PNG资源时提示文件找不到,自行修复屏幕切换逻辑后,修改为加载zip压缩包动效,logo可以正常播放,但应用始终停在logo页面无法跳转
- 引入Clock.schedule实现延迟逻辑后,出现属性报错:
AttributeError: 'float' object has no attribute 'ids'
初始资源加载报错
[ERROR ] [Image ] Not found <ezgif-frame-001.png> [ERROR ] [Image ] Not found <ezgif-frame-002.png> [ERROR ] [Image ] Not found <ezgif-frame-003.png> [ERROR ] [Image ] Not found <ezgif-frame-004.png> [ERROR ] [Image ] Not found <ezgif-frame-005.png> [ERROR ] [Image ] Not found <ezgif-frame-006.png> ...
最终报错信息
line 29, in process self.ids.numb.text = number AttributeError: 'float' object has no attribute 'ids'
错误原因
- Clock调用方法错误:将
Numberss.process类方法直接传入Clock.schedule_once,Clock执行时会自动把延迟时间(浮点型)作为第一个参数传入方法,导致process函数的self参数实际拿到的是浮点数值,自然没有ids属性,这是报错的直接原因 - 缺少页面跳转逻辑:没有监听logo动画播放完成的事件,也没有编写页面切换代码,应用会一直停在初始的logo页面
- 子线程直接操作UI:Kivy的所有UI更新必须在主线程执行,在子线程的
process函数中直接修改Label的text属性,存在线程安全问题,后续会出现偶发崩溃 - 初始路径问题:逐帧PNG找不到是因为PNG文件和运行的主Python文件不在同一目录,或者填写的是相对路径但工作目录不对,改为绝对路径或者把资源放到同目录即可解决
修复方案
Python代码修复
from kivy.app import App import random from kivy.lang import Builder from kivy.uix.screenmanager import ScreenManager, Screen import threading from kivy.clock import Clock class Main(ScreenManager): pass class Numberss(Screen): def __init__(self, **kwargs): super().__init__(**kwargs) def start_process(self): threading.Thread(target=self.process, daemon=True).start() def process(self): while True: num_list = ['null','four','three'] number = random.choice(num_list) # UI更新抛到主线程执行 Clock.schedule_once(lambda dt: self.set_text(number), 0) def set_text(self, number): self.ids.numb.text = number class Logo(Screen): def on_enter(self, *args): # 计算动效总时长:19帧 * 0.07秒/帧 = 1.33秒,加余量后2秒跳转 Clock.schedule_once(self.switch_to_number, 2) def switch_to_number(self, dt): self.manager.current = 'number' class NumbersApp(App): def build(self): return kv kv = Builder.load_file('temp.kv') if __name__ == '__main__': NumbersApp().run()
KV代码保持现有版本即可,需要注意:
- 保证
logos.zip和主Python文件在同一目录 - 如果要换回逐帧PNG加载,把所有
ezgif-frame-*.png放到主文件同目录,将Image的source属性改为ezgif-frame-001.png,Kivy会自动加载连续帧
内容的提问来源于stack exchange,提问作者Juru
相关产品推荐
相关产品推荐

