Kivy只对动态类的第一个实例抛出意外的“语法错误”

2024-10-04 05:28:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用Dynamic Class使我的Kivy应用程序中的所有文本输入都通过同一个验证回调。下面是示例代码:

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder

kv = '''
<smRoot>:
    SignUpScreen:
<signupText@TextInput>:
    font_size: '15sp'
    on_text_validate: app.callback1()
    multiline: False

<SignUpScreen>:
    font_size:'50sp'
    name:'signupscreen'
    canvas:
        Color:
            rgb: (0.09,0.65,0.8)
        Rectangle:
            pos: self.pos
            size: self.size
    BoxLayout:
        size_hint: (.75, .5)
        pos_hint: {'center_x': .5, 'center_y': .5}
        orientation: 'vertical'
        signupText:
            hint_text: 'Full Name'
        signupText:
            hint_text: 'Mobile Number'
        signupText:
            hint_text: 'Enter Password'
        signupText:
            hint_text: 'Re-Enter Password'
        Button:
            text: 'Sign Up'
            disabled: True
'''

Builder.load_string(kv)
class smRoot(ScreenManager):
    pass

class SignUpScreen(Screen):
    pass

class myApp(App):
    def build(self):
        smroot = smRoot()
        return smroot

    def callback1(self):
        print 'In Validation Callback'
if __name__ == '__main__':
    myApp().run()

这将引发以下错误:

^{pr2}$

然而令人惊讶的是,当我只将signupText类的第一个实例更改为父TextInput时,它可以工作:

BoxLayout:
    size_hint: (.75, .5)
    pos_hint: {'center_x': .5, 'center_y': .5}
    orientation: 'vertical'
    TextInput:
        hint_text: 'Full Name'
    signupText:
        hint_text: 'Mobile Number'
    signupText:
        hint_text: 'Enter Password'
    signupText:
        hint_text: 'Re-Enter Password'
    Button:
        text: 'Sign Up'
        disabled: True

有了这个小小的改变,语法错误就不再抛出了。当然,在这种情况下,回调只对最后三个文本输入框起作用。。。!在

Kivy是不是在某种程度上要求父类在动态类继承之前实例化一次?或者我的代码有错误吗?在此方面,如有任何帮助/建议/建议,将不胜感激。。。!在


Tags: textfromposimportselfsizepasswordtextinput
1条回答
网友
1楼 · 发布于 2024-10-04 05:28:35

在Kv语言中,小部件名称必须以大写字母开头。在

您必须将signupText命名为SignupText。见How to duplicate blocks of widgets in kv file (lowercase-only rule)

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder

kv = '''
<SmRoot>:
    SignUpScreen:
<SignupText@TextInput>:
    font_size: '15sp'
    on_text_validate: app.callback1()
    multiline: False

<SignUpScreen>:
    font_size:'50sp'
    name:'signupscreen'
    canvas:
        Color:
            rgb: (0.09,0.65,0.8)
        Rectangle:
            pos: self.pos
            size: self.size
    BoxLayout:
        size_hint: (.75, .5)
        pos_hint: {'center_x': .5, 'center_y': .5}
        orientation: 'vertical'
        SignupText:
            hint_text: 'Full Name'
        SignupText:
            hint_text: 'Mobile Number'
        SignupText:
            hint_text: 'Enter Password'
        SignupText:
            hint_text: 'Re-Enter Password'
        Button:
            text: 'Sign Up'
            disabled: True
'''

Builder.load_string(kv)
class smRoot(ScreenManager):
    pass

class SignUpScreen(Screen):
    pass

class myApp(App):
    def build(self):
        smroot = smRoot()
        return smroot

    def callback1(self):
        print('In Validation Callback')
if __name__ == '__main__':
    myApp().run()





    Builder.load_string(kv)
    class SmRoot(ScreenManager):
        pass

    class SignUpScreen(Screen):
        pass

    class myApp(App):
        def build(self):
            smroot = SmRoot()
            return smroot

        def callback1(self):
            print('In Validation Callback')
    if __name__ == '__main__':
        myApp().run()

相关问题 更多 >