Gesamte Zeile in MDDataTable farblich markieren und Checkbox setzen
Verfasst: Mittwoch 27. Juli 2022, 13:10
Hallo zusammen,
ich beschäftige mich mit kivyMD MDDataTable.
1. Problem:
In meiner Tabelle versuche ich eine gesamte Zeile farblich zu hinterlegen (soll bleiben, bis man mit dem Cursor eine andere Zeile anklickt).
2. Problem:
Ich möchte auch die zugehörige Checkbox aktivieren, die zur farblich hinterlegten Zeile gehört.
Irgendwelche Tipps, wie ich das umsetzen kann. Zur Zeit habe ich erstmal das Problem, daß ich in row.background_color_selected_cell nicht direkt die Spaltennummern mitgeben kann, die farblich gesetzt werden sollen.
Ich hoffe, meine Problemerklärung ist gut zu verstehen
ich beschäftige mich mit kivyMD MDDataTable.
1. Problem:
In meiner Tabelle versuche ich eine gesamte Zeile farblich zu hinterlegen (soll bleiben, bis man mit dem Cursor eine andere Zeile anklickt).
2. Problem:
Ich möchte auch die zugehörige Checkbox aktivieren, die zur farblich hinterlegten Zeile gehört.
Code: Alles auswählen
from kivymd.uix.screen import MDScreen
from kivymd.uix.button import MDFillRoundFlatButton
from kivymd.uix.toolbar import MDToolbar
import pprint
from kivy.metrics import dp
from kivymd.app import MDApp
from kivymd.uix.datatables import MDDataTable
class App(MDApp):
def __init__(self): # **kwargs
super().__init__() # **kwargs
self.btn_hide = False
self.row_object, self.delete_text, self.delete_object = str, str, int
self.screen, self.table = None, None
self.btn_delete = MDFillRoundFlatButton(
# text="Löschen",
pos_hint={'center_x': 0.2, 'center_y': 0.15},
size_hint=(0.2, 0.1),
font_size=20,
opacity=0,
on_press=self.delete)
self.btn_transfer = MDFillRoundFlatButton(
text="Übertragen",
pos_hint={'center_x': 0.8, 'center_y': 0.15},
size_hint=(0.2, 0.1),
font_size=20,
opacity=1,
on_press=self.transfer)
self.tbl_list = [
["1", "10.07.2022", "John", "Elder", "john@codemy.com", "(123) 456-7891"],
["2", "11.07.2022", "Mary", "Elder", "mary@codemy.com", "(123) 456-7892"],
["3", "12.07.2022", "Rose", "Elder", "rose@codemy.com", "(123) 456-7893"],
["4", "13.07.2022", "Jane", "Adams", "jane@codemy.com", "(123) 456-7894"],
["5", "14.07.2022", "Marc", "Elder", "marc@codemy.com", "(123) 456-7895"],
["6", "15.07.2022", "Petty", "Elder", "petty@codemy.com", "(123) 456-789"],
["7", "17.07.2022", "Tim", "Elder", "tim@codemy.com", "(123) 456-7898"],
["8", "18.07.2022", "Carrol", "Elder", "carrol@codemy.com", "(123) 456-7899"],
["9", "19.07.2022", "Carrol", "Elder", "carrol@codemy.com", "(123) 456-7899"],
["10", "20.07.2022", "Anne", "Elder", "anne@codemy.com", "(123) 456-7900"]
]
def build(self):
self.screen = MDScreen()
self.theme_cls.theme_style = "Dark"
self.theme_cls.primary_palette = "BlueGray"
toolbar = MDToolbar(title="Test")
toolbar.pos_hint = {"top": 1}
# toolbar.right_action_items = [["rotate-3d-variant"]]
self.screen.add_widget(toolbar)
self.table = MDDataTable(
size_hint=(0.95, 0.6),
pos_hint={'center_x': 0.5, 'center_y': 0.55},
rows_num=25,
check=True,
use_pagination=False,
background_color_header="#596163",
column_data=[
["Nr.", dp(20)],
["Date", dp(20)],
["First name", dp(20), self.sort_first_name],
["Last name", dp(20), self.sort_last_name],
["E-Mail Address", dp(38)],
["Phone Number", dp(34)]],
row_data=self.tbl_list)
self.table.bind(on_row_press=self.on_row_press)
self.screen.add_widget(self.table)
self.screen.add_widget(self.btn_delete)
self.screen.add_widget(self.btn_transfer)
return self.screen
@staticmethod
def sort_first_name(data):
return zip(*sorted(enumerate(data), key=lambda l: l[1][1]))
@staticmethod
def sort_last_name(data):
return zip(*sorted(enumerate(data), key=lambda l: l[1][2]))
def on_row_press(self, table, row):
start_index, end_index = row.table.recycle_data[row.index]["range"]
self.delete_object = row.table.recycle_data[start_index]["text"]
if row == self.row_object:
# Same row
self.btn_delete.opacity = 0
if not self.btn_hide:
self.btn_transfer.opacity = 0
self.btn_delete.opacity = 1
self.btn_hide = True
else:
self.btn_transfer.opacity = 1
self.btn_delete.opacity = 0
self.btn_hide = False
else:
# Different row
self.delete_text = f"Zeile {str(self.delete_object)}\nlöschen"
self.btn_delete.text = self.delete_text
self.row_object = row
self.btn_transfer.opacity = 0
self.btn_delete.opacity = 1
self.btn_hide = True
# Hier versuche ich erstmal meine Idee umzusetzen...
for i in range(start_index, end_index):
print(row.table.recycle_data[i]["text"])
row.background_color_selected_cell = "lightsteelblue"
print("---")
def delete(self, _):
for i, a in enumerate(self.tbl_list):
if a[0] == self.delete_object:
self.tbl_list.pop(i)
self.table.row_data = self.tbl_list
self.btn_transfer.opacity = 1
self.btn_delete.opacity = 0
self.btn_hide = False
def transfer(self, value):
print("transfer", value)
pp = pprint.PrettyPrinter(indent=5)
pp.pprint(self.tbl_list)
if __name__ == '__main__':
App().run()
Irgendwelche Tipps, wie ich das umsetzen kann. Zur Zeit habe ich erstmal das Problem, daß ich in row.background_color_selected_cell nicht direkt die Spaltennummern mitgeben kann, die farblich gesetzt werden sollen.
Ich hoffe, meine Problemerklärung ist gut zu verstehen
