You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

KivyMD应用无报错却无法运行问题求助(附代码)

问题排查与修复

你的KivyMD应用无法启动是因为几个关键隐性错误,以下是具体问题和修复方案:

核心问题点

  1. 缺失CodeInput组件导入:KV字符串中使用了CodeInput,但Python代码未导入该类,直接导致KV加载失败。
  2. 未实现绑定的方法:
    • WritePage类未定义save_title方法,但KV中CodeInput的on_text事件绑定了该方法,触发时会抛出AttributeError。
    • NotepadApp类未定义move_to_writepage和move_to_homepage方法,但按钮的on_release事件调用了这两个方法,引发运行时错误。
  3. Clock导入路径错误:原代码从kivy.properties导入Clock,实际应从kivy.clock导入。
  4. 数据库连接时机不合理:在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 23:20:08