gpt4 book ai didi

Python Kivy - 无法将屏幕(ScreenManager)的 TextInput 值提交到另一个屏幕的 ListView

转载 作者:行者123 更新时间:2023-12-01 09:26:06 25 4
gpt4 key购买 nike

我是 kivy 新手,需要 ListView 和 ScreenManager 方面的帮助。我设法在单个屏幕上使用 ListView,但我尝试通过 ScreenManager 在两个屏幕上使用它:我在主屏幕中有一个 ListView,并制作了一个按钮来导航到 ProfileScreen,我将在 TextInput“abc”和“defe”中输入值,并希望将它们提交到 ListView。当我使用此代码运行 .py 文件时,它可以工作,但是当我在 ProfileScreen 上输入值并按“确定”时,它崩溃并显示“ProfileScreen”没有属性“student_list”。如果我将 ProfileScreen(Screen) 的参数更改为 ProfileScreen(MainScreen) 它可以工作,但是页面 ProfileScreen 的内容是从 MainScreen 继承的,这是我不想要的。

如何解决这个问题?我将不胜感激任何形式的帮助,提前致谢。

这是我的代码:

学生数据库.py,学生数据库.kv

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 Kivy - 无法将屏幕(ScreenManager)的 TextInput 值提交到另一个屏幕的 ListView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50380542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com