簡體   English   中英

python - kivy:從另一個類調用函數

[英]python - kivy: Call function from another class

我目前正在使用 Python/Kivy 開發 GUI,並且在調用另一個類的函數時遇到了一些問題。 我設置了一個屏幕,其中包括一個 TextInput 小部件,可用於插入電子郵件地址。 通過單擊提交按鈕,調用函數“check_mail”,該函數使用正則表達式檢查電子郵件,然后打印文本(“電子郵件無效”)或更改屏幕(電子郵件地址將稍后被轉移到數據庫,現在只需在提交后更改屏幕即可)。 但是,如果電子郵件格式無效,該函數會向我打印文本,但是當從 InsertData 類調用 change_screen 函數時,它不起作用( AttributeError: 'NoneType' object has no attribute 'ids ' ) 如果我在 .kv 文件 {on_release: app.change_screen('home_screen')} 中調用 change_screen 函數,它工作正常。 如何從我的InsertData類訪問change_screen函數?

主文件

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()

插入數據.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()

這就是您可以為 B 類調用函數 x 的方法

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

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

更新托管以解決問題。

查看錯誤我注意到每次執行函數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 並且運行沒有任何問題。

我有一些解決方案只是為了展示它是如何工作的。

A 類 (self): def some_method(self): print("Print Here")

B 類 (self): def some_more_method(self): print("Let see here")

詳細信息:假設您想在 A 類中使用 B 類中的方法/函數。

'添加這一行' B.some_more_method(self)

這個對我有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM