Я пишу простое приложение с экраном входа в систему, используя kivy в python. Я решил разделить свой код kivy на более мелкие компоненты, но когда я помещаю один из них в конструктор, он выдает мне эту ошибку:
Traceback (most recent call last):
File "main.py", line 48, in <module>
screen_manager.add_widget(LoginScreen(name=AppState.LOGIN_SCREEN))
File "C:\Users\Matis\Desktop\python\yolobot\app\login.py", line 41, in __init__
super(Screen, self).__init__(**kwargs)
File "C:\Program Files\Python36\lib\site-packages\kivy\uix\relativelayout.py", line 265, in __init__
super(RelativeLayout, self).__init__(**kw)
File "C:\Program Files\Python36\lib\site-packages\kivy\uix\floatlayout.py", line 65, in __init__
super(FloatLayout, self).__init__(**kwargs)
File "C:\Program Files\Python36\lib\site-packages\kivy\uix\layout.py", line 76, in __init__
super(Layout, self).__init__(**kwargs)
File "C:\Program Files\Python36\lib\site-packages\kivy\uix\widget.py", line 348, in __init__
Builder.apply(self, ignored_consts=self._kwargs_applied_init)
File "C:\Program Files\Python36\lib\site-packages\kivy\lang\builder.py", line 469, in apply
self._apply_rule(widget, rule, rule, ignored_consts=ignored_consts)
File "C:\Program Files\Python36\lib\site-packages\kivy\lang\builder.py", line 585, in _apply_rule
self._apply_rule(child, crule, rootrule)
File "C:\Program Files\Python36\lib\site-packages\kivy\lang\builder.py", line 582, in _apply_rule
child = cls(__no_builder=True)
TypeError: __init__() got an unexpected keyword argument '__no_builder'
Я проверил эту ошибку в Интернете и нашел статьи, не связанные с моей проблемой, так что я думаю, что это довольно редко. Когда я помещаю код kivy класса LoginForm вместо ссылки на класс LoginForm в login.py, я не получаю никаких ошибок.
Вот код
main.py:
'' '
from kivy.config import Config
Config.set('graphics', 'resizable', False)
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, NoTransition
from kivy.uix.checkbox import CheckBox
from kivy.core.window import Window
from core.yolobot import Yolobot
from app.login import LoginScreen
from app.keyactivation import KeyActivationScreen
from app.yolobotui import YolobotScreen
from app.reactivation import ReactivationScreen
from app.appstate import AppState
screen_manager = ScreenManager(transition=NoTransition())
screen_manager.add_widget(LoginScreen(name=AppState.LOGIN_SCREEN))
screen_manager.add_widget(KeyActivationScreen(name=AppState.KEY_ACTIVATION_SCREEN))
screen_manager.add_widget(YolobotScreen(name=AppState.YOLOBOT_SCREEN))
screen_manager.add_widget(ReactivationScreen(name=AppState.REACTIVATION_SCREEN))
class YolobotApp(App):
title = "Yolobot"
def build(self):
Window.size = WINDOW_SIZE
Window.clearcolor = BACKGROUND_COLOR
return screen_manager
if __name__ == "__main__":
YolobotApp().run()
'' '
login.py:
'' '
from kivy.uix.screenmanager import Screen
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.textinput import TextInput
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.lang import Builder
from app.components.loginform import LoginForm
Builder.load_string("""
<LoginScreen>:
BoxLayout:
orientation: 'vertical'
padding: [10,50,10,50]
spacing: 50
Label:
text: 'Yolobot 1.0'
font_size: 64
LoginForm:
label_text: 'Username'
text_input_id: username
hide_content: False
LoginForm:
label_text: 'Password'
text_input_id: password
hide_content: True
Button:
text: 'Sign-in'
font_size: 20
""")
class LoginScreen(Screen):
def __init__(self, **kwargs):
super(Screen, self).__init__(**kwargs)
def login(login, password):
pass
'' '
loginform.py:
'' '
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.lang import Builder
Builder.load_string("""
<LoginForm>:
orientation: 'vertical'
Label:
text: root.label_text
font_size: 18
halign: 'left'
text_size: root.parent.width-20, 20
TextInput:
id: text_input_id
multiline: False
password: root.hide_content
font_size: root.text_input_font_size
""")
class LoginForm(BoxLayout):
def __init__(label_text='', text_input_id=None, hide_content=False):
super(BoxLayout, self).__init__()
self.label_text = label_text
self.text_input_id = text_input_id
self.hide_content = hide_content
self.text_input_font_size = 15
'' '