【发布时间】:2023-03-25 19:05:01
【问题描述】:
仍然是编程新手,但我遇到了一个可以在网上找到的错误。网上有什么,说在我的 .py 文件中写我的 .kv 代码作为字符串。我不想那样做。
我的代码:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty
from kivy.uix.popup import Popup
from kivy.uix.label import Label
from database import DataBase
from kivy.base import runTouchApp
from kivy.uix.spinner import Spinner
from kivymd.theming import ThemeManager
from kivy.uix.boxlayout import BoxLayout
from kivymd.app import MDApp
import os
from kivy.resources import resource_add_path
ROOT = os.path.dirname(os.path.abspath(__file__))
resource_add_path(ROOT)
sm = WindowManager()
db = DataBase("users.txt")
screens = [LoginWindow(name="login"), CreateAccountWindow(name="create"),MainWindow(name="main"), Calendar(name="Calendar")]
for screen in screens:
sm.add_widget(screen)
sm.current = "login"
class MyMainApp(MDApp):
theme_cls = ThemeManager()
theme_cls.primary_palette = "Teal"
def __init__(self, **kwargs):
Builder.load_file(os.path.join(ROOT, "my.kv"))
super().__init__(**kwargs)
App.__init__(self)
if __name__ == "__main__":
MyMainApp().run()
我的错误:
ValueError: KivyMD: App object must be initialized before loading root widget.
【问题讨论】:
-
您好!如果您确保发布minimal reproducible example,您会更容易回答您的问题。特别是,您没有在任何地方导入
WindowManager(),因此它会引发错误,并且我们没有(或可能需要)您的database代码。此外,您可能应该提供一个(最小的)my.kv示例,并删除任何您可以删除但仍会收到错误的代码。 -
P.S.这与您的问题没有直接关系,但是 Python 的 Pathlib 非常出色,并且可以使代码比所有
os.path.join的东西更具可读性和方便性。例如,您可以使用ROOT = Path(__file__).resolve().parent,这可能看起来并没有好多少,但是您可以将该文件夹中的文件简单地称为ROOT / 'my.kv',并且无论您使用的是什么操作系统,它都可以正常工作。