错误: 属性错误: 'kivy.properties.ObjectProperty'对象没有属性'text'



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

问题是:

LoginScreen内部

MenuScreen.get_data()

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仅在类的实例中有效。因此,您需要更改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装饰器。

最新更新