KivyMD应用无报错却无法运行问题求助(附代码)
问题排查与修复
你的KivyMD应用无法启动是因为几个关键隐性错误,以下是具体问题和修复方案:
核心问题点
- 缺失
CodeInput组件导入:KV字符串中使用了CodeInput,但Python代码未导入该类,直接导致KV加载失败。 - 未实现绑定的方法:
WritePage类未定义save_title方法,但KV中CodeInput的on_text事件绑定了该方法,触发时会抛出AttributeError。NotepadApp类未定义move_to_writepage和move_to_homepage方法,但按钮的on_release事件调用了这两个方法,引发运行时错误。
- Clock导入路径错误:原代码从
kivy.properties导入Clock,实际应从kivy.clock导入。 - 数据库连接时机不合理:在App启动前就建立数据库连接,建议移到App生命周期方法中管理。
修复后的完整代码
from kivy.uix.button import Button from kivymd.app import MDApp from kivymd.uix.boxlayout import MDBoxLayout from kivymd.uix.floatlayout import MDFloatLayout from kivymd.uix.card import MDCard from kivymd.uix.label import MDLabel from kivy.properties import ListProperty, StringProperty from kivy.clock import Clock # 修正Clock导入路径 from kivy.graphics.context_instructions import Color from kivy.graphics.vertex_instructions import Line, Rectangle, Ellipse from kivy.lang import Builder from kivy.uix.screenmanager import ScreenManager, Screen from kivy.metrics import dp from kivymd.uix.button import MDIconButton from kivy.uix.codeinput import CodeInput # 新增CodeInput导入 import sqlite3 import time import random from datetime import date class ScrnMngr(ScreenManager): pass class HomePage(Screen): def __init__(self, **kwargs): super(HomePage, self).__init__(**kwargs) class WritePage(Screen): def __init__(self, **kwargs): super(WritePage, self).__init__(**kwargs) # 实现绑定的save_title方法,可根据需求完善存储逻辑 def save_title(self, title_text, note_text): print(f"临时保存:标题={title_text},内容预览={note_text[:30]}...") kv = ''' ScrnMngr: id: ScrnMngr HomePage: name: 'HomePage' WritePage: name: 'WritePage' <HomePage> MDBoxLayout: id: first padding: dp(20) orientation: 'vertical' spacing: '20dp' canvas.before: Color: rgba: 0,1,1,1 Rectangle: pos: self.pos # 修正为自适应布局位置 size: self.size MDLabel: text: 'Notes' font_size: "40sp" size_hint: 1, .02 MDBoxLayout: size_hint: 1, .2 MDTextField: id: search_field hint_text: 'Search note' icon_left: 'magnify' #on_text: root.search_folder(self.text) MDScrollView: id: second pos_hint: {'center_x': 0.5, 'center_y': 0.8} size_hint: 1, .9 MDBoxLayout: id: third orientation:"vertical" spacing: '20dp' adaptive_height: True MDGridLayout: id: book default_size: 1, dp(30) elevation: "8dp" default_size_hint: 1, None spacing: '20dp' cols: 1 padding: 0,50 size_hint_y: None height: self.minimum_height MDFloatingActionButton: icon: 'page-next' on_release: app.root.current = 'WritePage' pos_hint: {'center_x': 0.8 , 'center_y': 0.1} <WritePage> orientation: 'vertical' MDBoxLayout: orientation: 'vertical' pos_hint: {'center_x': 0.5 , 'center_y': 0.4} size_hint: 1, 1 # 确保布局占满屏幕 CodeInput: id: title hint_text: 'Title' size_hint: 1, .1 mode: "fill" fill_color: app.sorbus on_text: root.save_title(self.text, note.text) CodeInput: id: note hint_text: 'Note' size_hint: 1, .9 mode: 'fill' multiline: True fill_color: app.sorbus on_text: root.save_title(title.text, self.text) MDIconButton: id: look icon: 'keyboard-backspace' on_release: app.root.current = 'HomePage' pos_hint: {'center_x': 0.07 , 'center_y': 0.96} ''' class NotepadApp(MDApp): title = 'Notepad' text_color = ListProperty((1,1,1,1)) opp = ListProperty((0,0,0,0)) grey = [234/255, 234/255, 234/255, 1] sorbus = [221/255, 110/255, 66/255, 1] periwinkle = [192/255, 214/255, 223/255, 1] champagne = [232/255, 218/255, 178/255, 1] colors = [grey,sorbus,champagne] no_of_cards = 0 def build(self): self.root_widget = Builder.load_string(kv) return self.root_widget def on_start(self): # App启动后再建立数据库连接 self.conn = sqlite3.connect('notes.db') self.c = self.conn.cursor() def on_stop(self): # App关闭时提交并关闭数据库连接 self.conn.commit() self.conn.close() if __name__ == '__main__': NotepadApp().run()
额外优化说明
- 修正了HomePage中Rectangle的布局参数,使用
self.pos和self.size适配动态布局 - 给WritePage的外层MDBoxLayout添加
size_hint:1,1,确保内容占满屏幕 - 移除了按钮事件中未定义的方法调用,你可根据需求在App类中补充页面切换逻辑
内容的提问来源于stack exchange,提问作者Diamond Belema
相关产品推荐
相关产品推荐

