#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