【问题标题】:How to edit a specific row in KivyMD MDDataTable如何编辑 KivyMD MDDataTable 中的特定行
【发布时间】:2020-06-19 22:26:38
【问题描述】:

我翻阅了源代码和文档,但找不到任何接近我需要的东西,有没有办法以编程方式编辑列和刷新数据表?我想在 MDDatatTable 中更新状态

【问题讨论】:

  • 您必须编辑column_data 和/或row_data
  • @JohnAnderson 好吧,但是有没有办法编辑特定的行,有没有办法刷新数据,或者如果一个新项目被添加到我正在加载的列表中,它会自动执行吗?
  • 如果你使用on_row_press事件,你可以得到一个CellRow实例的引用(也就是表的viewclass)并直接改变它的text。否则,我认为您将不得不 dismiss MDDataTable,用编辑后的数据重新创建它,然后 open 新的 MDDataTable。由于下面是RecycleView,看来你应该能够做一个refresh_from_data(),但我不知道如何做到这一点。
  • @JohnAnderson 好吧,我已经完成了所有工作,重新加载它并不是什么大不了的事,但无论如何你可以想到让单元格引用来编辑文本而不重新加载?如果没有,我可以重新加载几次,但就是这样
  • @JohnAnderson 其实没关系,即使您先将其关闭,由于某种原因您实际上不能多次打开该表

标签: kivy material-design kivy-language


【解决方案1】:

在这里我创建了一个小项目,用户通过 addproducts 选项卡在数据库中添加产品,数据表显示产品,点击按钮时表格会自行刷新

你必须相应地修改代码

希望这会有所帮助

main.py

from kivymd.app import MDApp
from kivy.lang import Builder
from kivymd.uix.tab import MDTabsBase
from kivymd.uix.floatlayout import MDFloatLayout
from kivymd.uix.datatables import MDDataTable
from kivy.uix.anchorlayout import AnchorLayout
from kivy.uix.screenmanager import ScreenManager
from kivy.metrics import dp
import mysql.connector
from kivy.core.window import Window 
Window.size =(350,600)


class Tab1(MDFloatLayout, MDTabsBase):
    def product_lists(self, *args):
        database = mysql.connector.connect(host="localhost" , user ="root" , password= "dumbre1902", database="localvendor")
        cursor = database.cursor()
        sql_select_Query = "select * from addproduct"
        cursor.execute(sql_select_Query)
        # get all records
        records = cursor.fetchall()
        layout = AnchorLayout()
        self.product_table = MDDataTable(
            pos_hint={'center_y': 0.41, 'center_x': 0.5},
            size_hint=(0.9, 0.78),
            elevation= 15,
            rows_num = 100,
            column_data=[
                ("Product Name", dp(25)),
                ("MRP", dp(15)),
                ("Quantity", dp(20)),
                ("Product Description", dp(30)),
                ],
                row_data=[
                        (f"{row[0]}", f"{row[1]}", f"{row[2]}", f"{row[3]}") for row in records
                ],
            )

        self.add_widget(self.product_table)
        return layout

    def on_enter(self):
        self.product_lists()

class Tab2(MDFloatLayout, MDTabsBase):
    pass

class DemoApp(MDApp):

    def build(self):
        sm = ScreenManager()
        sm.add_widget(Builder.load_file("testwidgets.kv"))
        return sm



DemoApp().run()

testwidgets.kv

#:import Snackbar kivymd.uix.snackbar.Snackbar

MDScreen:
    name: 'sellerprofile'
    MDNavigationLayout:
        size : root.width, root.height

        ScreenManager:
            id: screen_manager

            Screen:
                name: "mddatatable"

                BoxLayout:
                    orientation: 'vertical'

                    MDToolbar:
                        id: toolbar
                        title: "LOCAL VENDOR"
                        md_bg_color: 60/255, 194/255, 89/255, 1
                        

                    MDTabs:
                        lock_swiping: True
                        font_name: "fonts/Product Sans Regular.ttf"
                        background_color: 60/255, 194/255, 89/255, 1
                        Tab1:
                            
                            title: "Products"


                        Tab2:

                            title: "Add Products"


<Tab1>:


    MDRaisedButton:
        elevation: 13
        font_size: "16sp"
        size_hint: .4, .1
        text_color: 0/255,0/255,0/255,1
        md_bg_color: 60/255, 194/255, 89/255, 1
        text: 'See Products'
        on_press: 
            root.on_enter()
            Snackbar(text="Tap again to see recently added products",snackbar_x="10dp",snackbar_y="10dp",size_hint_x=.9,).open()
        pos_hint: {'center_x': .5, 'center_y': .9}
        font_name: "fonts/Product Sans Regular.ttf"
        


<Tab2>:

    MDFloatLayout:
        size_hint: .70, .03
        pos_hint: {"center_x": .5,"center_y": .83}

        MDTextField:
            id : productname
            hint_text: "Product Name"
            mode: "rectangle"
            pos_hint: {"center_x": .5,"center_y": .5}

    MDFloatLayout:
        size_hint: .30, .03
        pos_hint: {"center_x": .3,"center_y": .7}

        MDTextField:
            id: mrp
            hint_text: "MRP"
            mode: "rectangle"
            pos_hint: {"center_x": .5,"center_y": .5}
            input_filter: 'int'

    MDFloatLayout:
        size_hint: .30, .03
        pos_hint: {"center_x": .6,"center_y": .7}

        MDTextField:
            id: quantity
            hint_text: "Quantity"
            mode: "rectangle"
            pos_hint: {"center_x": .82,"center_y": .5}

    MDFloatLayout:
        size_hint: .70, .03
        pos_hint: {"center_x": .5,"center_y": .57}

        MDTextField:
            id: productdescription
            hint_text: "Product Description (optional)"
            mode: "rectangle"
            multiline: True
            pos_hint: {"center_x": .5,"center_y": .5}

    MDRaisedButton:
        text: "Add Product"
        elevation: 15
        size_hint: .5, .1
        font_size: "18sp"
        text_color: 0/255,0/255,0/255,1
        md_bg_color: 60/255, 194/255, 89/255, 1
        md_bg_color_disabled: 222/255, 222/255, 222/255, 1
        pos_hint: {"center_x": .5,"center_y": .3}
        font_name: "fonts/Product Sans Regular.ttf"
        disabled: True if (productname.text and mrp.text) == '' else False
        on_release:
            app.addproduct( productname, mrp , quantity , productdescription )
            app.show_product_added()

【讨论】:

    猜你喜欢
    • 2021-04-08
    • 1970-01-01
    • 2021-08-16
    • 2021-09-08
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    相关资源
    最近更新 更多