这是一个小程序,我希望允许对我的 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函数来选择表中的行。但是我们如何修改这个函数,以便在选择新行时自动取消选中该行呢?
在 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列表以匹配您的特定表结构和数据。