当前位置: 首页 > 知识库问答 >
问题:

KivyMD在改变屏幕上不创建MDList项目小部件使用root.ids和显示错误

壤驷深
2023-03-14

我试图用Kivymd在Python中构建一个应用程序,我刚刚开始学习这个kivymd框架,所以我面临的问题是,当我试图将屏幕从登录屏幕更改为主屏幕时,它会引起错误。我无法理解代码中的错误。

我希望它将屏幕切换到主屏幕,然后按“加入聊天”按钮显示列表。

下面是代码:

主要的派克

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen,ScreenManager
from kivymd.uix.list import MDList, OneLineIconListItem,IconLeftWidget


class LoginScreen(Screen):
    pass

class HomeScreen(Screen):
    pass



class DemoApp(MDApp):
    def build(self):
        self.theme_cls.theme_style="Dark"
        
        self.sm=ScreenManager()
        self.sm.add_widget(LoginScreen(name="login"))
        self.sm.add_widget(HomeScreen(name="home"))

        screen=Builder.load_file("helper_file.kv")
        return screen
    
    def do_login(self):
        self.sm.current = "home"
        for i in range(20):
            st_name="student "
            list_item = OneLineIconListItem(text=f"student {str(i)}")
            list_item.add_widget(IconLeftWidget(icon= "alpha-a-box"))
            self.root.ids.users_lst.add_widget(list_item)

DemoApp().run()

helper\u文件。千伏

ScreenManager:
    LoginScreen:
    HomeScreen:

<LoginScreen>:
    name: "login"
    Screen:
        MDLabel:
            text: "Demo App"
            halign: "center"
            pos_hint: {"center_x": .5, "center_y": .8}
            theme_text_color: "Primary"
        MDTextField:
            hint_text: "Enter username"
            helper_text: "to join the chat (test mode)"
            helper_text_mode: "on_focus"
            icon_right: "android"
            icon_right_color: app.theme_cls.primary_color
            pos_hint:{'center_x': 0.5, 'center_y': 0.5}
            size_hint_x:None
            width:311
        MDRoundFlatButton:
            text: "Join Chat"
            pos_hint: {"center_x": .5, "center_y": .4}
            on_release: app.do_login()
        MDLabel:
            text: "This is testing mode only"
            halign: "center"
            pos_hint: {"center_x": .5, "center_y": .2}
            theme_text_color:"Hint"

<HomeScreen>:
    name: "home"
    Screen:
        BoxLayout:
            orientation: "vertical"
            MDToolbar:
                title: "Demo Chat Application"
            ScrollView:
                MDList:
                    id: users_lst

运行此操作时,登录屏幕运行良好,但按下加入聊天按钮会引发以下错误:

self.root.ids.users_lst.add_widget(list_item)
   File "kivy\properties.pyx", line 864, in kivy.properties.ObservableDict.__getattr__
 AttributeError: 'super' object has no attribute '__getattr__'

共有1个答案

龙哲
2023-03-14

|1|

class HomeScreen(Screen):
    pass
<HomeScreen>:
    name: "home"
    Screen:
        BoxLayout:
            orientation: "vertical"
            MDToolbar:
                title: "Demo Chat Application"
            ScrollView:
                MDList:
                    id: users_lst

你有一个屏幕,它有一个屏幕,那不是你想做的。

<HomeScreen>:
    name: "home"
    BoxLayout:
        orientation: "vertical"
        MDToolbar:
            title: "Demo Chat Application"
        ScrollView:
            MDList:
                id: users_lst

####################################################### #######################################################

| 2 |

父不能访问内部孩子的id。(不清楚我知道,所以我会给你很多打印来帮助你理解)。

    def do_login(self):
        self.root.current = "home"
        for i in range(20):
            st_name = "student "
            list_item = OneLineIconListItem(text=f"student {str(i)}")
            list_item.add_widget(IconLeftWidget(icon="alpha-a-box"))

            print("this is my App:", self)
            print("this is my ScreenManager:", self.sm)
            print("this is my global app visual widget (which is equal to ScreenManager here):", self.root)
            print("this is the ScreenManager's dictionnary containing the widgets referenced with their id:", self.root.ids)
            print("this is the current Screen:",self.root.current_screen)
            print("this is current Screen dictionnary containing the widgets referenced with their id:", self.root.current_screen.ids)
            print("this is the actual MDList", self.root.current_screen.ids["users_lst"])
            self.root.current_screen.ids["users_lst"].add_widget(list_item)
 类似资料:
  • 我想在屏幕中的页面预览之前显示viewpager。前一页和下一页在屏幕中显示深度,并用深度动画滑动下一页。 你可以看看这个图像 我怎么做?

  • 我正在从旧的谷歌分析迁移到Firebase分析,现在我正在使用以下内容跟踪屏幕: 还尝试用这个: 我用这个跟踪事件: 我正在测试打开一些屏幕并传递其名称的应用程序,并且我还按了一些按钮来执行我显示的事件跟踪代码。 第一个问题是,在firebase面板中,我找不到“test command”事件...不知道我应该在哪里找到它,但我找不到它。 第二个问题是我可以看到我用于打开屏幕的活动的“屏幕类”,它

  • 谁能引导我过去吗?也许我的效用不好?

  • 我在制作electronjs的deb文件时遇到以下错误 我的package.json文件是{“name”:“wallet”,“version”:“1.1.0”,“description”:“wallet”,“main”:“src/main.js”,“scripts”:{“start”:“electronic.”,“build”:“electron-packager.myapp”,“pack”:“e

  • 我正在学习matplotlib,不知道如何保存图形而不在屏幕上打印。 所以我在网上做了一些研究,许多答案说解决方案是matplotlib.use(“Agg”)。而且必须在导入matplotlib.pyplot或pylab之前。 然后,当我在脚本的第一行添加它时,它根本不起作用。 我使用Anaconda Spyder,所以我重新启动了内核并再次运行了脚本,我得到了相同的错误信息。 然后我再次重启内核

  • 这可能是我处理布局的方式有问题。对Java和Android软件开发工具包来说有点新鲜。我正在使用Android Studio。 我在这一点上的目标是有一个应用程序,屏幕底部显示一个带有图标的导航栏,顶部有一个带有“关闭”按钮和“保存”按钮的工具栏。工具栏和导航栏之间应该是一个空白的白色屏幕。 但是我很难让工具栏停留在屏幕的顶部。灰色背景占据了白色背景前面的整个屏幕。下面是截图。 这是我所知道的:

  • 我试图在屏幕上垂直和水平居中显示文本。这是我的密码 如果我将flex:1添加到文本中,标题也会居中,这是不期望的。我不知道这是否相关,但我也不能修改标题视图的高度。我该如何解决这个问题?这些问题可以在这种小吃上重现。