Seite 1 von 1

Gesamte Zeile in MDDataTable farblich markieren und Checkbox setzen

Verfasst: Mittwoch 27. Juli 2022, 13:10
von DMD-OL
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 :)

Re: Gesamte Zeile in MDDataTable farblich markieren und Checkbox setzen

Verfasst: Montag 1. August 2022, 17:24
von DMD-OL
Trotzdem ääh, Danke

Re: Gesamte Zeile in MDDataTable farblich markieren und Checkbox setzen

Verfasst: Montag 1. August 2022, 18:50
von __deets__
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.

Re: Gesamte Zeile in MDDataTable farblich markieren und Checkbox setzen

Verfasst: Montag 1. August 2022, 19:12
von noisefloor
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