Проблема Kivy «Ошибка типа: невозможно преобразовать str в kivy.properties.Property» - PullRequest
0 голосов
/ 17 ноября 2018

Привет всем

Хорошо, поэтому в настоящее время я пытаюсь создать приложение Kivy, где вы можете вводить имена учеников, а имена добавляются в список.Я следовал учебному пособию по YouTube на тему Дерека Банаса, и я решил, что я также хотел бы реализовать функцию, посредством которой введенные и удаленные элементы будут сохранены в текстовом файле, и этот текстовый файл будет загружен обратно в следующий раз, когда приложениебыл начат.Я не получил это далеко из-за ошибки, указанной в моем заголовке.В первый раз приложение работает нормально, но при попытке запустить его во второй раз возникает проблема TypeError.Я предполагаю, что это как-то связано со мной, использующим список для хранения значений в текстовом файле, но я не совсем уверен, почему эта ошибка появляется.Ниже приведен весь мой код, включая файл .kv.

Примечание: я знаю, что использование простого текстового файла для хранения постоянных данных не рекомендуется и не масштабируется, но я просто пытаюсь освоиться с Kivy, и я не планирую выпускать этолюбым способом, поэтому нет необходимости говорить мне, что я не должен этого делать, я уже знаю D:

studentlist.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.properties import StringProperty
from kivy.properties import ListProperty
import csv
import os


class StudentListButton(ListItemButton):
    pass


class StudentDB(BoxLayout):

    # Connects the value in the TextInput widget to these
    # fields
    file_name = "./saved_names.txt"
    first_name_text_input = ObjectProperty()
    last_name_text_input = ObjectProperty()
    students_list = ObjectProperty()
    file_write_list =[]

    print("beginning reading file")
    if os.path.exists(file_name):
        read_write = 'r'
        names_file = open(file_name, read_write)
        for x in names_file:
            print("reading saved_names file")
            x = x.rstrip()
            file_write_list.append(x)
            print("First name appended to list")


    else:
        print("creating new saved_names file")
        read_write = 'w'
        names_file = open(file_name, read_write)
        names_file.write("")

    names_file.close()




    def submit_student(self):
        print("Submitting new student")
        # Get the student name from the TextInputs
        first_name_stripped = self.first_name_text_input.text.replace(" ", "")
        last_name_stripped = self.last_name_text_input.text.replace(" ","")
        student_name = first_name_stripped + " " + last_name_stripped

        # Add the student to the ListView
        self.students_list.adapter.data.extend([student_name])
        self.file_write_list.append(student_name)
        self.save_listt(self.file_write_list, self.file_name)
        # Reset the ListView
        self.students_list._trigger_reset_populate()

    def delete_student(self, *args):
        print("deleting student")
        # If a list item is selected
        if self.students_list.adapter.selection:

            # Get the text from the item selected
            selection = self.students_list.adapter.selection[0].text

            # Remove the matching item
            self.students_list.adapter.data.remove(selection)

            self.file_write_list.remove(selection)
            self.save_listt(self.file_write_list, self.file_name)
            # Reset the ListView
            self.students_list._trigger_reset_populate()

    def replace_student(self, *args):
        print("replacing student")
        # If a list item is selected
        if self.students_list.adapter.selection:

            # Get the text from the item selected
            selection = self.students_list.adapter.selection[0].text

            # Remove the matching item
            self.students_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.students_list.adapter.data.extend([student_name])

            for i, x in enumerate(self.file_write_list):
                if x == selection:
                    self.file_write_list[i] = str(student_name)

            self.save_listt(self.file_write_list, self.file_name)
            # Reset the ListView
            self.students_list._trigger_reset_populate()

    def save_listt(self, list_name, file_name):
        print("Saving names list to saved_names file")
        file_w = open(self.file_name, 'w')
        for x in list_name:
            file_w.write(x + '\n')
        file_w.close()



class StudentDBApp(App):

    def build(self):
        return StudentDB()





dbApp = StudentDBApp()

dbApp.run()

studentdb.kv

# Reference studentlist.py
#: import main studentlist
#: import ListAdapter kivy.adapters.listadapter.ListAdapter
#: import ListItemButton kivy.uix.listview.ListItemButton


StudentDB:

<StudentDB>:
    orientation: "vertical"
    first_name_text_input: first_name
    last_name_text_input: last_name
    students_list: students_list_view
    padding: 10
    spacing: 10

    BoxLayout:
        size_hint_y: None
        height: "40dp"

        Label:
            text: "First Name"
        TextInput:
            id: first_name
            multiline: False
        Label:
            text: "Last Name"
        TextInput:
            id: last_name
            multiline: False

    BoxLayout:
        size_hint_y: None
        height: "40dp"
        Button:
            text: "Submit"
            size_hint_x: 15
            on_press: root.submit_student()
        Button:
            text: "Delete"
            size_hint_x: 15
            on_press: root.delete_student()
        Button:
            text: "Replace"
            size_hint_x: 15
            on_press: root.replace_student()

    ListView:
        id: students_list_view
        adapter:
            ListAdapter(data=["Doug Smith"], cls=main.StudentListButton)

1 Ответ

0 голосов
/ 18 ноября 2018

Я точно не знаю, что является причиной этой ошибки, но вы можете исправить ее, поместив код инициализации в метод __init__() как:

class StudentDB(BoxLayout):

    # Connects the value in the TextInput widget to these
    # fields
    file_name = "./saved_names.txt"
    first_name_text_input = ObjectProperty()
    last_name_text_input = ObjectProperty()
    students_list = ObjectProperty()

    def __init__(self, **kwargs):
        super(StudentDB, self).__init__(**kwargs)
        self.file_write_list =[]

        print("beginning reading file")
        if os.path.exists(self.file_name):
            read_write = 'r'
            names_file = open(self.file_name, read_write)
            for x in names_file:
                print("reading saved_names file")
                x = x.rstrip()
                self.file_write_list.append(x)
                print("First name appended to list: " + x)
                self.students_list.adapter.data.extend([x])
        else:
            print("creating new saved_names file")
            read_write = 'w'
            names_file = open(self.file_name, read_write)
            names_file.write("")
            names_file.close()

Также обратите внимание, что вы создаете два StudentDB экземпляра. Один в вашем kv файле (по строке StudentDB:), а другой в вашем приложении build метод. Самое простое решение - просто удалить строку StudentDB: из файла kv.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...