我正在尝试从另一个类中的另一个函数调用另一个类中的另一个函数。
问题是:
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
装饰器。