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

Posted

技术标签:

【中文标题】python - kivy:从另一个类调用函数【英文标题】:python - kivy: Call function from another class 【发布时间】:2020-04-16 03:11:26 【问题描述】:

我目前正在使用 Python/Kivy 开发 GUI,但在调用另一个类的函数时遇到了一些问题。我设置了一个屏幕,其中包括一个 TextInput 小部件,可用于插入电子邮件地址。通过单击提交按钮,调用函数“check_mail”,该函数使用正则表达式检查电子邮件,然后打印文本(“电子邮件无效”)或更改屏幕(电子邮件地址将稍后被传输到数据库,现在只需在提交后更改屏幕即可)。但是,如果电子邮件格式无效,该函数会打印文本给我,但是当从 InsertData 类调用 change_screen 函数时,它不起作用(AttributeError: 'NoneType' object has no属性 '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()

【问题讨论】:

请发minimal reproducible example 【参考方案1】:

这就是你可以为 B 类调用函数 x 的方法

 class A:
        def __init__(self):
            pass
        def x(self):
            print('x')

 class B:
        def __init__(self):
            A().x()

【讨论】:

感谢您的回答!我遇到的问题是,如果我使用你的方法,那么我没有函数名,我可以用它来从我的 .kv 文件中调用。我正在使用我的 .kv/ 按钮来调用 .kv 文件的根对象/类中的函数。然后,在该根类中,我想从另一个类中调用一个函数。那么如何将您的方法添加到我现有的设置中呢?【参考方案2】:

更新设法解决了问题。

查看错误我注意到每次执行函数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 并且运行没有任何问题。

【讨论】:

以上是关于python - kivy:从另一个类调用函数的主要内容,如果未能解决你的问题,请参考以下文章

使用 Kivy 的 Python 跨类函数调用

Kivy 在另一个类中调用函数

Python / Kivy - 在另一个调用函数的屏幕中替换标签的值

Python / Kivy - 在调用函数的另一个屏幕中替换标签的值

Python Kivy 无法从另一个类访问 id

(Kivy) 从 App 类调用函数 - 函数对象没有属性