如何在 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 获取数据?

如何从 KivyMD 文本字段中获取文本?

如何动态更改 MDDialog KivyMD 中的文本字段?

如何在 KivyMD (Python) 中结合导航抽屉和多个屏幕?

使用按钮更改 kivy 或 kivymd 中的屏幕