【问题标题】:Use ids in on_start() function kivy Python在 on_start() 函数 kivy Python 中使用 id
【发布时间】:2021-06-13 10:43:10
【问题描述】:

所以我正在构建一个常识问答游戏,在应用启动时,玩家的分数(保存在 .txt 文件中)应该显示在标签中。

我已尝试为此使用 on_start() 函数,但我似乎无法访问“分数”标签的 ID。这是我给出错误的代码行:

self.root.get_screen("home_screen").ids.score.text = str(playerScore)

我收到以下错误:

AttributeError: 'super' object has no attribute '__getattr__'

这是我的完整代码:

#main.py

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen

Builder.load_file('design.kv')

class RootWidget(ScreenManager):
    pass

class HomeScreen(Screen):
    pass

class MainApp(App):

    def build(self):
        return RootWidget()

    def on_start(self):
        with open("score.txt", "r") as f:
            playerScore = f.readline()
        
        self.root.get_screen("home_screen").ids.score.text = str(playerScore)




if __name__ == "__main__":
    MainApp().run()

#design.kv    

<HomeScreen>:
GridLayout:
    cols: 1

    GridLayout:
        cols: 2

        Button:
            id: infoButton
            text: "Wiki"

        Label:
            id: score

    GridLayout:
        cols: 1

        Label:
            id: Question
            text: "Question"

        Button:
            id: Button1
            text: "Option 1"

        Button:
            id: Button1
            text: "Option 2"

        Button:
            id: Button1
            text: "Option 3"

        Button:
            id: Button1
            text: "Option 4"

<RootWidget>:
HomeScreen:
    name: "home_screen"

还有一个 'score.txt' 文件,里面只有 - '100'。

谢谢。

【问题讨论】:

  • 你在哪里为HomeScreen定义name
  • 嗨,约翰,我未能发布 kivy 文件的最后几行。我已经更新了帖子。 HomeScreen 在 die design.kv 文件的最后一行中定义。道歉。

标签: python python-3.x kivy kivy-language kivymd


【解决方案1】:

你的方法是对的。我不确定你希望你的布局是什么样子,但你犯了两个错误:

  • 您的 .kv 代码在您的类定义后缺少缩进
  • 即使有缩进,您也可以将三个 GridLayout 叠放在一起。一种方法是将这三个 GridLayout 放在 BoxLayout 中,或者只是以另一种方式构建 GridLayout(例如,将所有小部件打包在一个 GridLayout 中)。基本上你已经有了“Wiki”和“100”(分数)按钮,但它们只是在选项按钮后面,所以你几乎看不到它们。
#design.kv    

<HomeScreen>:
    BoxLayout:
        GridLayout:
            cols: 1

        GridLayout:
            cols: 2

            Button:
                id: infoButton
                text: "Wiki"

            Label:
                id: score

        GridLayout:
            cols: 1

            Label:
                id: Question
                text: "Question"

            Button:
                id: Button1
                text: "Option 1"

            Button:
                id: Button1
                text: "Option 2"

            Button:
                id: Button1
                text: "Option 3"

            Button:
                id: Button1
                text: "Option 4"

<RootWidget>:
    HomeScreen:
        name: "home_screen"

【讨论】:

  • 谢谢你的回答,对我帮助很大。
  • 不客气。您可以通过将答案标记为正确来帮助我作为回报:D 祝您有美好的一天
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多