Kivy 2.0.0 Свойство StringProperty не распознается

#python #kivy #kivy-language #nameerror

#python #kivy #kivy-язык #ошибка имени

Вопрос:

Я знаю, что это дубликат, но никакие ответы на это не сработали для меня.

Я пытаюсь добавить виджет, который служит в качестве строки ввода с подсказкой.

Я получаю ошибку имени, в которой указано, что ‘prompt_text’ в строке 2 client.kv не определен. Я считаю, что это проблема, связанная с тем, что StringProperty() не запускается.

Вот мой файл python:

 from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.popup import Popup
from kivy.uix.label import Label
from kivy.uix.widget import Widget
import kivy.properties as kyProps


import ChatClient

CLIENT = None
VERSION = open("Version.txt").read()


class LoginWindow(Screen):
    namee = kyProps.ObjectProperty(None)
    password = kyProps.ObjectProperty(None)

    def loginBtn(self):
        global CLIENT
        CLIENT = ChatClient(self.namee.ti.text, self.password.ti.text, VERSION)
        if CLIENT.didConFail:
            errorMsg = f"Failed to connect. Reason: {CLIENT.connectFailedReason}"
            pop = Popup(title='Login Error', content=Label(text=errorMsg))
            pop.open()
        elif "REFUSED" in CLIENT.finalSetUpMsg:
            pop = Popup(title='Login Error', content=Label(text=CLIENT.finalSetUpMsg))
            pop.open()
        else:
            sm.current = "main"


class MainWindow(Screen):
    pass


class StyleEditorWindow(Screen):
    pass


class PMWindow(Screen):
    pass


class ChatWidget(Widget):
    pass


class InputLineWidget(Widget):
    prompt_text = kyProps.StringProperty("")
    ti = kyProps.ObjectProperty(None)


class WindowManager(ScreenManager):
    pass


kv = Builder.load_file("client.kv")

sm = WindowManager()

screens = [LoginWindow(name="login"), MainWindow(name="main"), StyleEditorWindow(name="styleEditor"), PMWindow(name="pm")]
for screen in screens:
    sm.add_widget(screen)
sm.current = "login"


class CpClientApp(App):
    def build(self):
        return sm


if __name__ == "__main__":
    CpClientApp().run()
 

И вот мой файл client.kv:

 <InputLineWidget>:
    prompt_text: prompt_text
    ti: ti
    GridLayout:
        cols: 2
        size: root.width, root.height

        Label:
            text: prompt_text

        TextInput:
            id: ti
            multiline: false

<ChatWidget>:

<LoginWindow>:
    namee: namee
    password: password

    size: root.width, root.height

    GridLayout:
        cols: 1

        InputLineWidget:
            id: namee
            prompt_text: "Name: "

        InputLineWidget:
            id: password
            prompt_text: "Password: "

        Button:
            text: "Log In"
            on_release:
                root.manager.transition.direction = "up"
                root.loginBtn()

<MainWindow>:

<StyleEditorWindow>:

<PMWindow>:
 

Я пробовал много решений, основанных на других, сталкивающихся с подобными проблемами, но ни одно из них не сработало.
Я использую python 3.7 в Windows 10 с использованием Kivy 2.0.0
Буду признателен за любую помощь. Спасибо.

Комментарии:

1. При публикации ошибки всегда указывайте полную обратную трассировку. Вы вырезали весь полезный контекст, который он дает.

Ответ №1:

Строка:

 prompt_text: prompt_text
 

создает ObjectProperty объект named prompt_text , содержащий ссылку на объект, имеющий id значение of prompt_text . Но поскольку это id не определено в <InputLineWidget> правиле вашего kv файла, вы получаете отмеченную ошибку.

Если вы хотите prompt_text , чтобы оно использовалось в качестве text для метки, измените kv на:

 <InputLineWidget>:
    ti: ti
    GridLayout:
        cols: 2
        size: root.width, root.height

        Label:
            text: root.prompt_text

        TextInput:
            id: ti
            multiline: false