我是新手,需要ListView和ScreenManager的帮助。我设法在单个屏幕上使用ListView,但是我试图通过ScreenManager在两个屏幕上使用它:
我在MainScreen中有一个ListView,并做了一个按钮以导航到ProfileScreen,在这里我将在TextInput中输入“ abc”和“ defe”的值,并希望将它们提交给ListView。
当我使用此代码运行.py文件时,它可以工作,但是当我在ProfileScreen上输入值并按“确定”时,它崩溃并说“ ProfileScreen”没有属性“ student_list”。如果我将ProfileScreen(Screen)的参数更改为ProfileScreen(MainScreen),则可以使用,但是ProfileScreen页面的内容是从MainScreen继承的,我不需要。
我该如何解决这个问题?在此先感谢您的帮助。
这是我的代码:
studentdb.py,
学生数据库
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty
from kivy.uix.listview import ListItemButton
from kivy.uix.screenmanager import ScreenManager, Screen
class StudentListButton(ListItemButton):
pass
class Manager(ScreenManager):
main_screen = ObjectProperty()
profile_screen = ObjectProperty()
class MainScreen(Screen):
first_name_text_input= ObjectProperty()
last_name_text_input= ObjectProperty()
student_list = ObjectProperty()
def submit_student(self):
# Get the student name from the TextInputs
student_name = self.first_name_text_input.text + " " + self.last_name_text_input.text
# Add the student to the ListView
self.student_list.adapter.data.extend([student_name])
# Reset the ListView
self.student_list._trigger_reset_populate()
def delete_student(self, *args):
if self.student_list.adapter.selection:
# Get the text from the item selected
selection = self.student_list.adapter.selection[0].text
# Remove the matching item
self.student_list.adapter.data.remove(selection)
# Reset the ListView
self.student_list._trigger_reset_populate()
def replace_student(self, *args):
# If a list item is selected
if self.student_list.adapter.selection:
# Get the text from the item selected
selection = self.student_list.adapter.selection[0].text
# Remove the matching item
self.student_list.adapter.data.remove(selection)
# Get the student name from the TextInputs
student_name = self.first_name_text_input.text + " " + self.last_name_text_input.text
# Add the updated data to the list
self.student_list.adapter.data.extend([student_name])
# Reset the ListView
self.student_list._trigger_reset_populate()
class ProfileScreen(Screen):
abc_text_input=ObjectProperty()
def_text_input=ObjectProperty()
def okay(self):
abc_name = self.abc_text_input.text + " " + self.def_text_input.text
# Add the student to the ListView
self.student_list.adapter.data.extend([abc_name])
# Reset the ListView
self.student_list._trigger_reset_populate()
class StudentDBApp(App):
def build(self):
return Manager()
if __name__=="__main__":
StudentDBApp().run()
------------------------------------------------------------------
#: import main studentdb
#: import ListAdapter kivy.adapters.listadapter.ListAdapter
#: import ListItemButton kivy.uix.listview.ListItemButton
<MainScreen>:
first_name_text_input: first_name
last_name_text_input: last_name
student_list: student_list
BoxLayout:
orientation: "vertical"
BoxLayout:
Label:
text:"First Name:"
TextInput:
id: first_name
Label:
text:"Last Name:"
TextInput:
id: last_name
BoxLayout:
Button:
text:"Submit"
on_release: root.submit_student()
Button:
text:"Delete"
on_release: root.delete_student()
Button:
text:"Replace"
on_release: root.replace_student()
Button:
text: "New"
on_release: root.manager.current="profile_screen"
ListView:
id: student_list
adapter:
ListAdapter(data=['Doug Smith'], cls=main.StudentListButton)
<ProfileScreen>:
abc_text_input: abc
def_text_input: defe
BoxLayout:
orientation: "vertical"
BoxLayout:
Button:
text:"Back"
on_release: root.manager.current="main_screen"
BoxLayout:
Label:
text:"abc"
TextInput:
id: abc
Label:
text: "def"
TextInput:
id: defe
BoxLayout:
Button:
text: "Okay"
on_release: root.okay()
<Manager>:
id: screen_manager
main_screen: main_screen
profile_screen: profile_screen
MainScreen:
id: main_screen
name:"main_screen"
manager: screen_manager
ProfileScreen:
id: profile_screen
name: "profile_screen"
manager: screen_manager
最佳答案
您遇到的错误是student_list
是MainScreen
而不是ProfileScreen
的属性,因此您无法自行访问它,建议阅读以下内容:What is the purpose of self?
在您的情况下,解决方案是通过ScreenManager
访问正确的屏幕:
def okay(self):
abc_name = self.abc_text_input.text + " " + self.def_text_input.text
main_screen = self.manager.get_screen('main_screen')
# Add the student to the ListView
main_screen.student_list.adapter.data.extend([abc_name])
# Reset the ListView
main_screen.student_list._trigger_reset_populate()
关于python - Python Kivy-无法将屏幕(ScreenManager)的TextInput值提交到另一个屏幕的 ListView ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50380542/