我是新手,需要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_listMainScreen而不是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/

10-11 04:42