如何在 Kivymd MDDataTable 中启用单行选择

问题描述 投票:0回答:1

这是一个小程序,我希望允许对我的 MDTataTable 之一进行单一选择。这是通过在新检查一行时自动取消选中一行来完成的。

from kivymd.app import MDApp
from kivy.metrics import dp
from kivy.lang import Builder
from kivymd.uix.datatables import MDDataTable
from kivymd.uix.boxlayout import MDBoxLayout
from kivy.uix.checkbox import CheckBox
Builder.load_string(
"""
<StudentNote>:
    spacing: 10
    padding: 5
    BoxLayout:
        size_hint_y: .1
        spacing: 5
        MDLabel:
            text: 'Nom' 
            size_hint_x: .4
        TextInput:
            id: nom
            hint_text: "Entrez le nom de l'eleve"
        MDLabel:
            text: 'Note'
            size_hint_x: .4
        TextInput:
            id: note
            hint_text: "Entrez la note de l'eleve"
        Button:
            text: 'Valider'
            size_hint_x: .4
            on_press: root.add_table()
    BoxLayout:
        id: tablebox
    BoxLayout:
        size_hint_y: .1
        Button: 
            text: 'Supprimer'
            on_press: root.delete_row()
        Button:
            text: 'Modifier'
            on_press: root.update_row()


"""

    )

class StudentNote(MDBoxLayout):
    def __init__(self, **kwargs):
        super(StudentNote, self).__init__(**kwargs)
        self.orientation = 'vertical'
        self.table = MDDataTable(check=True, column_data = [('N°', dp(25)),('Nom', dp(60)),('Note', dp(30)),])
        self.table.bind(on_row_press=self.on_row_press)
        self.table.bind(on_check_press=self.on_check_press)
        self.ids.tablebox.add_widget(self.table)

    def add_table(self):
        
        if self.table.row_data == []:
            data = ('1',self.ids.nom.text, self.ids.note.text)
            self.table.row_data.append(data)
        else:
            last_data = self.table.row_data[len(self.table.row_data)-1]
            number = str(eval('{}+1'.format(last_data[0])))
            data = (number,self.ids.nom.text, self.ids.note.text)
            self.table.row_data.append(data)
        self.ids.nom.text = ''
        self.ids.note.text = ''
        print (self.table.row_data)

    def on_row_press(self,instance_table, instance_row):
        """Called when a table row is clicked."""
        print(instance_table.row_data)

    def on_check_press(self, instance_table, current_row):
        """Called when the check box in the table row is checked."""
        self.select_data= current_row
        print(tuple(current_row))

    def delete_row(self):
        try:
            self.table.row_data.remove(tuple(self.select_data))
        except:
            pass

    def update_row(self):
        self.ids.nom.text = self.select_data[0]
        self.ids.note.text = self.select_data[1]
        try:
            self.table.row_data.remove(tuple(self.select_data))
        except:
            pass 


class NoteApp(MDApp):
    def build(self):
        return StudentNote()

if __name__ == '__main__':
    NoteApp().run()

这里我们使用on_check_press函数来选择表中的行。但是我们如何修改这个函数,以便在选择新行时自动取消选中该行呢?

python kivy kivymd
1个回答
0
投票

在 KivyMD 的 MDDataTable 中,您可以通过将

use_pagination
属性设置为
True
并将
check
属性设置为
on_check
来启用单行选择。此外,您应该处理
on_check
事件来管理选定的行。这是一个例子:

from kivy.lang import Builder
from kivymd.app import MDApp

KV = '''
BoxLayout:
    orientation: 'vertical'

    MDDataTable:
        id: datatable
        use_pagination: True
        check: 'on_check'
        column_data:
            - "Column 1", dp(30)
            - "Column 2", dp(30)
            - "Column 3", dp(30)
        row_data:
            - "Row 1"
            - "Row 2"
            - "Row 3"
'''

class MyApp(MDApp):
    def build(self):
        return Builder.load_string(KV)

    def on_check(self, instance_table, current_row):
        selected_rows = instance_table.get_row_checks()
        print("Selected Rows:", selected_rows)

MyApp().run()

在此示例中,use_pagination 设置为 True 以启用每行的复选框,check 设置为“on_check”以指定单击复选框时要调用的方法。然后 on_check 方法将选定的行打印到控制台。您可以自定义 on_check 方法以根据所选行执行特定操作。

调整column_data和row_data列表以匹配您的特定表结构和数据。

© www.soinside.com 2019 - 2024. All rights reserved.