簡體   English   中英

KivyMD:“超級”對象在基於條件的屏幕轉換期間沒有屬性“__getattr__”

[英]KivyMD: 'super' object has no attribute '__getattr__' during screen transition based on condition

我想根據成功的身份驗證從登錄屏幕切換到菜單屏幕,但這是在長時間搜索基於條件的屏幕轉換后我能做的最好的事情。 大多數網站都說 kivymd 中的屏幕轉換應該使用 .kv 文件中的“on-release”來完成,但我認為它不適用於我的代碼。

我在代碼上標記了有問題的行,這會引發異常。

Teste.py

from kivy.lang import Builder
from kivymd.app import MDApp
from kivymd.uix.dialog import MDDialog
from kivymd.uix.button import MDFlatButton
from kivy.uix.screenmanager import ScreenManager, Screen


class login(Screen):
    pass
class menu(Screen):
    pass

Builder.load_file('lteste.kv')
class LoginApp(MDApp):
    dialog = None
    def build(self): #método construtor da parte visual do aplicativo
        
        self.theme_cls.theme_style = "Light"
        self.theme_cls.primary_palette = "Indigo"
        self.theme_cls.accent_palette = "Blue"

        self.sm = ScreenManager()
        self.sm.add_widget(login(name="login"))
        self.sm.add_widget(menu(name="menu"))
        self.sm.current = "menu"
        return self.sm
    
    def dialog_box(self):
        if not self.dialog:
            self.dialog = MDDialog(
                title="Log In",
                text=f"Welcome {self.root.ids.user.text}!",
                buttons=[MDFlatButton(text="Ok", text_color=self.theme_cls.primary_color,
                                      on_release=self.close),],)
        return self.dialog.open()
    
    def login(self):
        if self.root.ids.user.text=='1' and self.root.ids.password.text=='1':
            self.sm.current = "menu" #<- problem
            self.dialog_box()
            return True
        else:
            return False
    
    def close(self, instance):
        self.dialog.dismiss()
        

LoginApp().run()

lteste.kv


<login>:
    id: login
    name: "login"
    MDCard:
        size_hint: None, None
        size: 300, 600
        pos_hint: {"center_x": 0.5, "center_y": 0.5}
        elevation: 10
        padding: 65
        spacing: 35
        orientation: 'vertical'
        MDIcon:
            icon: 'account'
            icon_color: 0, 0, 0, 0
            halign: 'center'
            font_size: 180
        MDTextFieldRound:
            id: user
            icon_left: "account-check"
            hint_text: "Usuário"
            foreground_color: 1, 0, 1, 1
            size_hint_x: None
            width: 220
            font_size: 20
            pos_hint: {"center_x": 0.5}
        MDTextFieldRound:
            id: password
            icon_left: "key-variant"
            hint_text: "Senha"
            foreground_color: 1, 0, 1, 1
            size_hint_x: None
            height: 1
            width: 220
            font_size: 20            
            pos_hint: {"center_x": 0.5}
            password: True
        MDFillRoundFlatButton:
            text: "ENTRAR"
            font_size: 15
            pos_hint: {"center_x": 0.5}
            on_press: app.login()
        MDFillRoundFlatButton:
            text: "REGISTRAR-SE"
            font_size: 15
            pos_hint: {"center_x": 0.5}
<menu>
    name: "menu"
    id: menu
    MDCard:
        size_hint: None, None
        size: 300, 600
        pos_hint: {"center_x": 0.5, "center_y": 0.5}
        elevation: 10
        padding: 65
        spacing: 35
        orientation: 'vertical'
        MDRaisedButton:
            text: "Test"

應用程序root不包含您想要的ids 它們位於login屏幕小部件中,因為您在其下用 kivy 語言定義了它們。 這將有助於在登錄屏幕上存儲參考以訪問它們。 代替

        self.sm.add_widget(login(name="login"))

        self.login_screen = login(name="login")
        self.sm.add_widget(self.login_screen)

然后,您可以像這樣訪問小部件,

                text=f"Welcome {self.login_screen.ids.user.text}!",

        if self.login_screen.ids.user.text=='1' \
                and self.login_screen.ids.password.text=='1':

Kivy 文檔中有一個關於kivy.uix.widget.Widget.ids的示例,還有Accessing Widgets defined inside Kv lang in your Python code

暫無
暫無

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

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