Gesamte Zeile in MDDataTable farblich markieren und Checkbox setzen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

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.

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 :)
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

Trotzdem ääh, Danke
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na, der Lehrgang für passiv-aggressives Posten hat sich ja gelohnt. War sicher auch teurer als die Mitgliedsgebühr hier, die bekanntlich ordentlich ist, und prompte Antworten auf alle erdenklichen Fragen garantiert. Innerhalb von Minuten.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ich sehe das als Erweisung der Ehre für diese Forum, weil der TE einfach positiv denkend davon ausgeht, dass er/sie auch für sehr speziellen Themen und einem GUI Framework, das eher (noch) nicht im Mainstream (im Vergleich zu Tkinter, Qt und GTK) ist, prompt eine umfassende Antwort bekommt. Wobei man im gegebenen Fall glaube ich die Plus-Mitgliedschaft hier haben muss, von der normalen Mitgliedsgebühr ist diese Art von Fragen nicht abgedeckt.

Aber ich habe was gelernt: mir war bis eben nicht bewusst, dass es Kivy im Material Design überhaupt gibt.

Gruß, noisefloor
Antworten