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