尝试运行 kivy 的 .py 文件时,我不断收到 app.root 中无效实例的错误。当我同时具有滚动视图和下拉列表时,它不起作用

问题描述 投票:0回答:1

我有一些使用 Python 和 SQLite 的经验,我目前正在学习 Kivy,因为我正在做一个项目。我想编写一个问卷应用程序来提出问题并从中收集数据以备日后使用。我在 youtube 上关注了 GridLayout、ScrollView、DropDown 等分离部分的教程,并试图将它们放在一起制作一份调查问卷。以下是我的完整代码。

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.dropdown import DropDown
from kivy.lang import Builder
from kivy.uix.scrollview import ScrollView
from kivy.core.window import Window

Builder.load_string("""
<CustomDropDown>
    Button:
        text: "1st item"
        size_hint_y: None
        height: 30
        on_release: root.select("1st item")
    Button:
        text: "2nd item"
        size_hint_y: None
        height: 30
        on_release: root.select("2nd item")
    Button:
        text: "3rd item"
        size_hint_y: None
        height: 30
        on_release: root.select("3rd item")
    Button:
        text: "4th item"
        size_hint_y: None
        height: 30
        on_release: root.select("4th item")
""")

class CustomDropDown(DropDown):
    pass

class QuestionnaireApp(App):

    def build(self):
        self.layout = GridLayout(cols = 1, spacing = 10, size_hint_y = None, padding = (200,50))
        self.layout.bind(minimum_height = self.layout.setter("height"))

        Window.clearcolor = (1,1,1,1)

        self.ttl = Label(text = "Title",
                          height = 50,
                          font_size = 24,
                          color = "black")
        self.layout.add_widget(self.ttl)

        self.code_ask = Label(text = "Code?", size_hint_y = None,
                              height = 30, color = "black")
        self.layout.add_widget(self.code_ask)

        self.code_in = TextInput(size_hint_y = None, height = 30)
        self.layout.add_widget(self.code_in)

        self.main = Button(text = "Select item", size_hint_y = None, height = 30)
        dropdown = CustomDropDown()
        self.main.bind(on_release = dropdown.open)
        dropdown.bind(on_select = self.select_text)

        self.click = Button(text = "Submit", size_hint_y = None, height = 30, on_release = self.submit)
        self.layout.add_widget(self.click)
        
        self.root = ScrollView(size_hint = (1, None), size = (Window.width, Window.height))
        self.root.add_widget(self.layout)

        return self.root, self.main
    
    def select_text(self, instance, x):
        self.main.text = x

    def submit(self, obj):
        teach_code = self.code_in.text

if __name__ == '__main__':`
    QuestionnaireApp().run()

我希望应用程序运行并生成一个带有标题、标签、文本输入框、下拉列表和具有滚动功能的按钮的窗口。但是,当我运行这段代码时,它会产生如下错误:

Exception has occurred: Exception
Invalid instance in App.root
  File "C:\...\try.py", line 79, in <module>
    QuestionnaireApp().run()
Exception: Invalid instance in App.root

当我在没有下拉菜单的情况下运行它时,一切正常。当我在没有滚动功能的情况下运行代码时,只显示下拉列表而不显示其他任何内容。

我该如何解决这个问题?

python kivy scrollview dropdown
1个回答
0
投票

build()
App
方法必须返回一个单独的小部件,它成为您的
App
显示的根。您的
build()
方法返回两个小部件的元组,这将不起作用。尝试添加:

    self.layout.add_widget(self.main)

到您的

build()
方法,并将返回更改为:

return self.root
© www.soinside.com 2019 - 2024. All rights reserved.