如何在 KivyMD 的 .kv 文件中使用 kivy 中的数据表?
Posted
技术标签:
【中文标题】如何在 KivyMD 的 .kv 文件中使用 kivy 中的数据表?【英文标题】:How to use datatables in kivy along/in .kv file in KivyMD? 【发布时间】:2021-10-05 04:19:22 【问题描述】:我正在开发一个有两个屏幕的密码管理器应用程序。一个屏幕用于用户登录/注册,另一个屏幕用于向用户显示不同 url 的用户名和密码。我为此创建了一个单独的 kv 文件。现在在第二个屏幕中,我想添加一个数据表,它将以排列良好的格式显示用户数据。
根据 kivy 文档,我们只能在主程序中添加数据表,而不是在 .kv 文件中,但在我的情况下,我已经有一个 .kv 文件。那么如何在第二个屏幕的程序中添加数据表?
from kivy.config import Config
from kivy import Config
Config.set('graphics', 'width', '500')
Config.set('graphics', 'height', '600')
Config.set('graphics', 'resizable', 'False')
from kivy.lang import Builder
from kivymd.app import MDApp
from kivy.uix.screenmanager import ScreenManager, Screen
from kivymd.uix.datatables import MDDataTable
import sqlite3
class MainWindow(Screen):
pass
class SecondWindow(Screen):
pass
class WindowManager(ScreenManager):
pass
class MainApp(MDApp):
def build(self):
Config.set('graphics', 'resizable', False)
self.theme_cls.theme_style = "Dark"
self.theme_cls.primary_palette = "Purple"
# self.background_color = (0,0,0,0)
return Builder.load_file("login.kv")
MainApp().run()
我的 .kv 文件------>
WindowManager:
MainWindow:
SecondWindow:
<MainWindow>:
name: "main"
MDCard:
size_hint:None,None
size:400,500
pos_hint:"center_x":.5,"center_y":.5
elevation:10
padding:25
spacing:25
background_color:25
orientation:"vertical"
<SecondWindow>:
name: "second"
BoxLayout:
orientation:"vertical"
size:root.width,root.height
padding:30
spacing:25
Label:
markup:True
font_size:35
text:"SAVED PASSWORDS"
halign: "left"
size_hint_y: None
height:self.texture_size[1]
#padding_y:-15
MDDataTable:
text: "Go Back"
【问题讨论】:
这个答案可能对你有帮助,它有一个登录屏幕,稍后需要将该信息移动到一个表中,刷新现有表中的新数据***.com/questions/69083706/… 【参考方案1】:你可以这样做(例如)
from kivymd.app import MDApp
from kivymd.uix.datatables import MDDataTable
from kivy.lang.builder import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.metrics import dp
KV = """
<LoginWindow>:
name: "main"
MDBoxLayout:
orientation: 'vertical'
padding: 10
MDLabel:
halign: "center"
text: 'User login/registration'
MDFloatingActionButton:
icon: 'key'
pos_hint: 'center_x': 0.5
on_release:
app.change_screen('second')
app.add_datatable()
<DataWindow>:
name: "second"
MDBoxLayout:
orientation: 'vertical'
padding: 10
MDFloatingActionButton:
icon: 'arrow-left'
on_release: app.change_screen('main')
AnchorLayout:
id: data_layout
WindowManager:
LoginWindow:
DataWindow:
id: data_scr
"""
class LoginWindow(Screen):
pass
class DataWindow(Screen):
pass
class WindowManager(ScreenManager):
pass
class Example(MDApp):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.data_tables = None
def build(self):
return Builder.load_string(KV)
def add_datatable(self):
self.data_tables = MDDataTable(
size_hint=(0.9, 0.8),
column_data=[
("No.", dp(30)),
("User", dp(30)),
("Password", dp(30)),
],
row_data=[
(
"1",
"The pitonist",
"Strong password",
),
(
"2",
"The c++ lover",
"Save me!!!:)",
),
]
)
self.root.ids.data_scr.ids.data_layout.add_widget(self.data_tables)
def change_screen(self, screen: str):
self.root.current = screen
Example().run()
【讨论】:
【参考方案2】:你也可以通过这种方式做同样的事情
from kivymd.app import MDApp
from kivy.uix.screenmanager import Screen, ScreenManager
from kivymd.uix.datatables import MDDataTable
from kivy.metrics import dp
from kivy.uix.anchorlayout import AnchorLayout
from kivy.lang.builder import Builder
KV = """
ScreenManager:
DemoPage:
ClientsTable:
<DemoPage>:
MDRaisedButton:
text: " Next "
size_hint: 0.5, 0.06
pos_hint: "center_x": 0.5, "center_y": 0.4
on_release:
root.manager.current = 'Clientstable'
<ClientsTable>:
name: 'Clientstable'
"""
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)),
("Head 1", dp(30)),
("Head 2", dp(30)),
("Head 3", dp(30)),
("Head 4", dp(30)), ],
row_data=[
(f"i + 1", "C", "C++", "JAVA", "Python")
for i in range(50)], )
self.add_widget(self.data_tables)
return layout
def on_enter(self):
self.load_table()
class DemoPage(Screen):
pass
sm = ScreenManager()
sm.add_widget(DemoPage(name='demopage'))
sm.add_widget(ClientsTable(name='Clientstable'))
class MainWindow(MDApp):
def build(self):
screen = Builder.load_string(KV)
return screen
if __name__ == "__main__":
MainWindow().run()
【讨论】:
以上是关于如何在 KivyMD 的 .kv 文件中使用 kivy 中的数据表?的主要内容,如果未能解决你的问题,请参考以下文章
在 kivy2 或 kivymd 中,有没有一种方法可以动态创建屏幕而不将它们添加到 kv 文件中
如何使用 Python 代码从 kv 文件中的 TextField 获取数据?
如何动态更改 MDDialog KivyMD 中的文本字段?