我有一些使用 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
当我在没有下拉菜单的情况下运行它时,一切正常。当我在没有滚动功能的情况下运行代码时,只显示下拉列表而不显示其他任何内容。
我该如何解决这个问题?
build()
的App
方法必须返回一个单独的小部件,它成为您的App
显示的根。您的 build()
方法返回两个小部件的元组,这将不起作用。尝试添加:
self.layout.add_widget(self.main)
到您的
build()
方法,并将返回更改为:
return self.root