如何将 MDDataTable 添加到不是主应用 class 的 class 中的屏幕?
How can I add an MDDataTable to a Screen in a class that's not the main app class?
我正在尝试创建一个应用程序,在您登录后会显示 table 个用户。如果登录成功,我希望将用户发送到另一个包含 MDDataTable 的屏幕。
我在网上找到的所有示例仅展示了如何在主应用程序中使用构建方法显示 table。
代码示例:
class ScreenOne(Screen):
# Displays MDDataTable without the need to press anything to view the table.
class ScreenTwo(Screen):
# When this screen validates user successfully it sends
# me to the other screen that shows an
# MDDataTable and not a blank screen etc...
sm = ScreenManager()
class MainApp(MDApp):
def build(self):
sm.add_widget(ScreenOne(name='screenone'))
sm.add_widget(ScreenTwo(name='screentwo'))
return sm
MainApp().run()
我总是出现空白屏幕或以下错误:
ValueError: KivyMD: App object must be initialized before loading root widget. See https://github.com/kivymd/KivyMD/wiki/Modules-Material-App#exceptions
我一直在更改代码试图修复它,但我一直 运行 陷入各种错误和问题中,我只是不够了解,无法使我的问题更清楚。
这是我的 .py
文件代码:
from kivy.properties import ObjectProperty
from kivymd.app import MDApp
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.stacklayout import MDStackLayout
from kivymd.uix.floatlayout import FloatLayout
from kivy.uix.screenmanager import Screen, ScreenManager
from kivymd.uix.datatables import MDDataTable
from kivy.metrics import dp
from kivy.uix.anchorlayout import AnchorLayout
class ClientsTable(Screen):
def load_table(self):
layout = Screen()
data_tables = MDDataTable(
size_hint=(0.9, 0.6),
use_pagination=True,
check=True,
column_data=[
("No.", dp(30)),
("Column 1", dp(30)),
("Column 2", dp(30)),
("Column 3", dp(30)),
("Column 4", dp(30)),
("Column 5", dp(30)),],
row_data=[
(f"{i + 1}", "2.23", "3.65", "44.1", "0.45", "62.5")
for i in range(50)],)
layout.add_widget(data_tables)
return layout
class LoginPage(Screen):
username = ObjectProperty()
password = ObjectProperty()
def validate_user(self):
if self.username.text == "m":
sm.current = "Clientstable"
self.username.text = ""
self.password.text = ""
else:
print("Not here!")
sm = ScreenManager()
class MainWindow(MDApp):
def build(self):
self.title = "EasySport"
sm.add_widget(LoginPage(name='Loginpage'))
sm.add_widget(ClientsTable(name='Clientstable'))
return sm
if __name__ == "__main__":
MainWindow().run()
.kv
代码:
ScreenManager:
LoginPage:
ClientsTable:
<LoginPage>:
username: User
password: Pass
MDTextField:
id: User
hint_text: "Username"
size_hint: 0.5, 0.09
pos_hint: {"center_x": 0.5, "center_y": 0.7}
MDTextField:
id: Pass
hint_text: "Password"
size_hint: 0.5, 0.09
pos_hint: {"center_x": 0.5, "center_y": 0.6}
MDFillRoundFlatButton:
text: "Login"
size_hint: 0.5, 0.06
pos_hint: {"center_x": 0.5, "center_y": 0.4}
on_release:
root.validate_user()
root.manager.transition.direction = 'left'
<ClientsTable>:
MDFillRoundFlatButton:
text: "Back"
size_hint: 0.5, 0.06
pos_hint: {"center_x": 0.5, "center_y": 0.4}
on_release:
root.manager.transition.direction = 'right'
root.manager.current = 'Loginpage'
MDFillRoundFlatButton:
text: "Load Table"
size_hint: 0.5, 0.06
pos_hint: {"center_x": 0.5, "center_y": 0.3}
on_release:
root.load_table()
现在当我按下 Load Table
按钮时它没有任何反应!
我解决了!
这是 .py
文件代码:
from kivy.lang import Builder
from kivy.properties import ObjectProperty
from kivymd.app import MDApp
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.stacklayout import MDStackLayout
from kivymd.uix.floatlayout import FloatLayout
from kivy.uix.screenmanager import Screen, ScreenManager
from kivymd.uix.datatables import MDDataTable
from kivy.metrics import dp
from kivy.uix.anchorlayout import AnchorLayout
class ClientsTable(Screen):
def load_table(self):
layout = AnchorLayout()
self.data_tables = MDDataTable(
pos_hint={'center_y': 0.5, 'center_x': 0.5},
size_hint=(0.9, 0.6),
use_pagination=True,
check=True,
column_data=[
("No.", dp(30)),
("Column 1", dp(30)),
("Column 2", dp(30)),
("Column 3", dp(30)),
("Column 4", dp(30)),
("Column 5", dp(30)),],
row_data=[
(f"{i + 1}", "2.23", "3.65", "44.1", "0.45", "62.5")
for i in range(50)],)
self.add_widget(self.data_tables)
return layout
def on_enter(self):
self.load_table()
class LoginPage(Screen):
username = ObjectProperty()
password = ObjectProperty()
def validate_user(self):
if self.username.text == "m":
sm.current = "Clientstable"
self.username.text = ""
self.password.text = ""
else:
print("Not here!")
sm = ScreenManager()
class MainWindow(MDApp):
def build(self):
sm.add_widget(LoginPage(name='Loginpage'))
sm.add_widget(ClientsTable(name='Clientstable'))
return sm
if __name__ == "__main__":
MainWindow().run()
和.kv
文件代码:
ScreenManager:
LoginPage:
ClientsTable:
<LoginPage>:
username: User
password: Pass
MDTextField:
id: User
hint_text: "Username"
size_hint: 0.5, 0.09
pos_hint: {"center_x": 0.5, "center_y": 0.7}
MDTextField:
id: Pass
hint_text: "Password"
size_hint: 0.5, 0.09
pos_hint: {"center_x": 0.5, "center_y": 0.6}
MDFillRoundFlatButton:
text: "Login"
size_hint: 0.5, 0.06
pos_hint: {"center_x": 0.5, "center_y": 0.4}
on_release:
root.validate_user()
我只需要将 Screen
的 on_enter()
方法添加到我的 class 中,就像文档中所说的那样。参见 here
我正在尝试创建一个应用程序,在您登录后会显示 table 个用户。如果登录成功,我希望将用户发送到另一个包含 MDDataTable 的屏幕。
我在网上找到的所有示例仅展示了如何在主应用程序中使用构建方法显示 table。
代码示例:
class ScreenOne(Screen):
# Displays MDDataTable without the need to press anything to view the table.
class ScreenTwo(Screen):
# When this screen validates user successfully it sends
# me to the other screen that shows an
# MDDataTable and not a blank screen etc...
sm = ScreenManager()
class MainApp(MDApp):
def build(self):
sm.add_widget(ScreenOne(name='screenone'))
sm.add_widget(ScreenTwo(name='screentwo'))
return sm
MainApp().run()
我总是出现空白屏幕或以下错误:
ValueError: KivyMD: App object must be initialized before loading root widget. See https://github.com/kivymd/KivyMD/wiki/Modules-Material-App#exceptions
我一直在更改代码试图修复它,但我一直 运行 陷入各种错误和问题中,我只是不够了解,无法使我的问题更清楚。
这是我的 .py
文件代码:
from kivy.properties import ObjectProperty
from kivymd.app import MDApp
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.stacklayout import MDStackLayout
from kivymd.uix.floatlayout import FloatLayout
from kivy.uix.screenmanager import Screen, ScreenManager
from kivymd.uix.datatables import MDDataTable
from kivy.metrics import dp
from kivy.uix.anchorlayout import AnchorLayout
class ClientsTable(Screen):
def load_table(self):
layout = Screen()
data_tables = MDDataTable(
size_hint=(0.9, 0.6),
use_pagination=True,
check=True,
column_data=[
("No.", dp(30)),
("Column 1", dp(30)),
("Column 2", dp(30)),
("Column 3", dp(30)),
("Column 4", dp(30)),
("Column 5", dp(30)),],
row_data=[
(f"{i + 1}", "2.23", "3.65", "44.1", "0.45", "62.5")
for i in range(50)],)
layout.add_widget(data_tables)
return layout
class LoginPage(Screen):
username = ObjectProperty()
password = ObjectProperty()
def validate_user(self):
if self.username.text == "m":
sm.current = "Clientstable"
self.username.text = ""
self.password.text = ""
else:
print("Not here!")
sm = ScreenManager()
class MainWindow(MDApp):
def build(self):
self.title = "EasySport"
sm.add_widget(LoginPage(name='Loginpage'))
sm.add_widget(ClientsTable(name='Clientstable'))
return sm
if __name__ == "__main__":
MainWindow().run()
.kv
代码:
ScreenManager:
LoginPage:
ClientsTable:
<LoginPage>:
username: User
password: Pass
MDTextField:
id: User
hint_text: "Username"
size_hint: 0.5, 0.09
pos_hint: {"center_x": 0.5, "center_y": 0.7}
MDTextField:
id: Pass
hint_text: "Password"
size_hint: 0.5, 0.09
pos_hint: {"center_x": 0.5, "center_y": 0.6}
MDFillRoundFlatButton:
text: "Login"
size_hint: 0.5, 0.06
pos_hint: {"center_x": 0.5, "center_y": 0.4}
on_release:
root.validate_user()
root.manager.transition.direction = 'left'
<ClientsTable>:
MDFillRoundFlatButton:
text: "Back"
size_hint: 0.5, 0.06
pos_hint: {"center_x": 0.5, "center_y": 0.4}
on_release:
root.manager.transition.direction = 'right'
root.manager.current = 'Loginpage'
MDFillRoundFlatButton:
text: "Load Table"
size_hint: 0.5, 0.06
pos_hint: {"center_x": 0.5, "center_y": 0.3}
on_release:
root.load_table()
现在当我按下 Load Table
按钮时它没有任何反应!
我解决了!
这是 .py
文件代码:
from kivy.lang import Builder
from kivy.properties import ObjectProperty
from kivymd.app import MDApp
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.stacklayout import MDStackLayout
from kivymd.uix.floatlayout import FloatLayout
from kivy.uix.screenmanager import Screen, ScreenManager
from kivymd.uix.datatables import MDDataTable
from kivy.metrics import dp
from kivy.uix.anchorlayout import AnchorLayout
class ClientsTable(Screen):
def load_table(self):
layout = AnchorLayout()
self.data_tables = MDDataTable(
pos_hint={'center_y': 0.5, 'center_x': 0.5},
size_hint=(0.9, 0.6),
use_pagination=True,
check=True,
column_data=[
("No.", dp(30)),
("Column 1", dp(30)),
("Column 2", dp(30)),
("Column 3", dp(30)),
("Column 4", dp(30)),
("Column 5", dp(30)),],
row_data=[
(f"{i + 1}", "2.23", "3.65", "44.1", "0.45", "62.5")
for i in range(50)],)
self.add_widget(self.data_tables)
return layout
def on_enter(self):
self.load_table()
class LoginPage(Screen):
username = ObjectProperty()
password = ObjectProperty()
def validate_user(self):
if self.username.text == "m":
sm.current = "Clientstable"
self.username.text = ""
self.password.text = ""
else:
print("Not here!")
sm = ScreenManager()
class MainWindow(MDApp):
def build(self):
sm.add_widget(LoginPage(name='Loginpage'))
sm.add_widget(ClientsTable(name='Clientstable'))
return sm
if __name__ == "__main__":
MainWindow().run()
和.kv
文件代码:
ScreenManager:
LoginPage:
ClientsTable:
<LoginPage>:
username: User
password: Pass
MDTextField:
id: User
hint_text: "Username"
size_hint: 0.5, 0.09
pos_hint: {"center_x": 0.5, "center_y": 0.7}
MDTextField:
id: Pass
hint_text: "Password"
size_hint: 0.5, 0.09
pos_hint: {"center_x": 0.5, "center_y": 0.6}
MDFillRoundFlatButton:
text: "Login"
size_hint: 0.5, 0.06
pos_hint: {"center_x": 0.5, "center_y": 0.4}
on_release:
root.validate_user()
我只需要将 Screen
的 on_enter()
方法添加到我的 class 中,就像文档中所说的那样。参见 here