error: AttributeError: 'kivy.properties.ObjectProperty' object has no attribute 'text'

error: AttributeError: 'kivy.properties.ObjectProperty' object has no attribute 'text'

我正在尝试从另一个 class 中的另一个函数调用 class 中的一个函数。

这里是问题所在:

里面LoginScreen

        MenuScreen.get_data()

和内部 class MenuScreen

    @classmethod
    def get_data(self):
        self.menuName.text = self.data[0][0]
        self.menuBalance.text = self.data[0][1]

.kv

screen_helper = '''
ScreenManager:
    LoginScreen:
    MenuScreen:
    RegisterScreen:
    SendScreen:
    
<LoginScreen>:
    name: 'login'

    username: username
    password: password

    Image:
        source: 'G:/My Drive/Scripts/Projects/KivyGUI/backgroundLight.jpeg'
        
        canvas:
            Color:
                rgba:(1,1,1,0.7)
                
            Rectangle:
                pos: 500,200
                size: 275,400
    
    MDLabel:
        text: 'Login'
        font_style: 'H2'
        font_size: 50
        theme_text_color: 'Secondary'
        halign: 'center'
        pos_hint: {'center_y': 0.73}        

    MDTextField:
        id: username
        hint_text: 'Username'
        icon_right: "android"
        icon_right_color: app.theme_cls.primary_color
        pos_hint: {'center_x': 0.5, 'center_y': 0.6}
        size_hint_x: None
        width: 250
        
    MDTextField:
        id: password
        hint_text: 'Password'
        helper_text: 'forgot password?'
        helper_text_mode: 'on_focus'
        icon_right: "android"
        icon_right_color: app.theme_cls.primary_color
        pos_hint: {'center_x': 0.5, 'center_y': 0.5}
        size_hint_x: None
        width: 250
        
    MDRectangleFlatButton:
        text: 'Login'
        pos_hint: {'center_x': 0.565, 'center_y': 0.4}
        size_hint_x: None
        width: 250
        on_release:
            root.show_data(None)
            root.manager.current = 'menu'
            
    MDFlatButton:
        text: 'Register'
        theme_text_color: 'Hint'
        pos_hint: {'center_x': 0.43, 'center_y': 0.4}
        size_hint_x: None
        width: 250
        on_release:
            root.manager.current = 'register'


<MenuScreen>:
    name: 'menu'
    
    menuName: menuName
    menuBalance: menuBalance

    Image:
        source: 'G:/My Drive/Scripts/Projects/KivyGUI/backgroundDark.jpeg'        
        
    GridLayout:
        canvas:
            Color:
                rgba:(0,0,0,0.4)

            Rectangle:
                pos: self.pos
                size: self.size
            
        
    GridLayout:
        size_hint: 0.4, 0.6
        pos_hint: {'center_x': 0.65, 'center_y': 0.5}
        spacing: 20
        padding_x: 0.8
        cols: 2
                
        MDRectangleFlatButton:
            text: 'Profile'
            size_hint: 0.4,0.1
            font_size: 25
        MDRectangleFlatButton:
            text: 'Transaction History'
            size_hint: 0.4,0.1
            font_size: 25
        MDRectangleFlatButton:
            text: 'Send Money'
            size_hint: 0.4,0.1
            font_size: 25
            on_release:
                root.manager.current = 'send'
                
        MDRectangleFlatButton:
            text: 'Received Money'
            size_hint: 0.4,0.1
            font_size: 25
    
    FloatLayout:
        orientation: 'tb-lr'
        size_hint: 0.3,1
        pos_hint: {'top': 1, 'left': 0}
        canvas:
            Color:
                rgba:(1,1,1,0.7)

            Rectangle:
                pos: self.pos
                size: self.size
        
        Image:
            source: 'G:/My Drive/Scripts/Projects/KivyGUI/profileIcon2.png'
            pos_hint: {'center_x': 0.5, 'center_y': 0.7}
            size_hint: 0.7,0.7
            
        MDLabel:
            text: 'Welcome back,'
            font_style: 'H4'
            theme_text_color: 'Secondary'
            halign: 'center'
            pos_hint: {'center_y': 0.43}
            
        MDLabel:
            id: menuName
            text: '_'
            font_style: 'H2'
            font_size: 50
            halign: 'center'
            pos_hint: {'center_y': 0.36}
            
        MDLabel:
            id: menuBalance
            text: '0000'
            font_style: 'H2'
            font_size: 20
            pos_hint: {'center_y': 0.975, 'right': 0.8}

                        
    GridLayout:
        size_hint: 0.7,0.1
        pos_hint: {'right': 1, 'center_y': 1}
        canvas:
            Color:
                rgba:(1,1,1,0.7)

            Rectangle:
                pos: self.pos
                size: self.size
        
    MDIconButton:
        icon: 'cog'
        pos_hint: {'center_y': 0.975, 'right': 1}

    MDIconButton:
        icon: 'account-off'
        pos_hint: {'center_y': 0.975, 'right': 0.97}
        on_release:
            root.manager.current = 'login'

.py

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty, StringProperty
from kivy.core.window import Window
Window.size = (1280, 720)


class LoginScreen(Screen):
    username = ObjectProperty(None)
    password = ObjectProperty(None)

    def show_data(self, obj):
        client.send(pickle.dumps(['login', self.username.text, self.password.text]))
        MenuScreen.data = pickle.loads(client.recv(1024))
        MenuScreen.get_data()

class MenuScreen(Screen):
    data = '_'
    menuName = ObjectProperty(None)
    menuBalance = ObjectProperty(None)

    @classmethod
    def get_data(self):
        self.menuName.text = self.data[0][0]
        self.menuBalance.text = self.data[0][1]


sm = ScreenManager()
sm.add_widget(LoginScreen(name='login'))
sm.add_widget(MenuScreen(name='menu'))

class DemoApp(MDApp):
    def build(self):
        self.theme_cls.primary_palette = 'Pink'
        self.theme_cls.theme_style = 'Light'
        screen = Builder.load_string(screen_helper)
        # Clock.schedule_interval(MenuScreen.name_ret, 15)
        return screen


DemoApp().run()

问题是您在 classmethod 中使用 Properties,但 Properties 仅在 class 的实例中有效。所以你需要改变show_data()方法来使用MenuScreen的实例,像这样:

def show_data(self, obj):
    client.send(pickle.dumps(['login', self.username.text, self.password.text]))
    MenuScreen.data = pickle.loads(client.recv(1024))
    ms = self.manager.get_screen('menu')  # get the instance of MenuScreen
    ms.get_data()

并从 get_data() 方法中删除 @classmethod 装饰器。