python-kivy:从另一个类调用函数

时间:2019-12-25 13:32:25

标签: python function class kivy kivy-language

我目前正在用Python / Kivy开发GUI,从另一个类调用函数时遇到一些问题。我设置了一个屏幕,其中包括一个TextInput小部件,可用于插入电子邮件地址。通过单击Submit-Button,将调用函数“ check_mail”,该函数使用正则表达式检查电子邮件,然后打印文本(“电子邮件无效”)或更改屏幕(“电子邮件地址将稍后将其传输到数据库,现在可以在提交后更改屏幕)。但是,如果电子邮件格式无效,但是该函数确实会向我打印文本,但是从InsertData类调用change_screen函数时,该函数将无法正常工作( AttributeError:“ NoneType”对象没有属性'ids'),如果我在.kv文件{on_release:app.change_screen('home_screen')}中调用change_screen函数,则效果很好。如何从我的 InsertData 类访问 change_screen 函数?

main.py

class HomeScreen(Screen):
    pass

class InsertData(Screen):
    def check_mail(self):
        addressToVerify = self.ids.email_main.text
        match = re.match('^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$', addressToVerify)
        if match == None:
            print('Email not valid!')
        else:
            MainApp().change_screen('home_screen')

GUI = Builder.load_file("main.kv")

class MainApp(App):

    def build(self):
        return GUI    
    def change_screen(self, screen_name):
        screen_manager = self.root.ids[
            'screen_manager']
        screen_manager.transition = CardTransition()
        screen_manager.transition.direction = 'up'
        screen_manager.transition.duration = .3
        screen_manager.current = screen_name    

MainApp().run()

insert_data.kv

<InsertData>:
    FloatLayout:
        canvas:
            Rectangle:
                size: self.size
                pos: self.pos
                source: "background/background_main.png"
   GridLayout:
       rows: 1
       pos_hint: {"top": 1, "right": 1}
       size_hint: 1, .8
       TextInput:
           id: email_main
           hint_text: "E-Mail Address"
       LabelButton:       
           text: "Submit"
           on_release:
               root.check_mail()

2 个答案:

答案 0 :(得分:0)

这是您可以如何为B类调用函数x

boot

答案 1 :(得分:0)

更新可以解决问题。

看着我注意到的错误,每次执行一次change_screen函数(由于无效的电子邮件格式),它将在change_screen中运行以下行:

screen_manager = self.root.ids['screen_manager']

问题在于, self.root 引用的是InsertData类,该类没有属性。由于 self.roots 引用MainApp类中的GUI,因此我在change_screen函数中更改了该行,如下所示:

screen_manager = GUI.ids['screen_manager']

现在该函数引用的是固定的GUI,而不是self.root,并且正在运行,没有任何问题。