Kivy(MD) Buttons zur Laufzeit und MD Dialog

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
DerD11
User
Beiträge: 1
Registriert: Freitag 10. Januar 2020, 14:08

Hallo zusammen,

direkt vorne weg: ich bin neu, Amateur und habe auch nur geringe Programiererfahrung durch selbst erlerntes vba programmieren. Nun habe ich mir dennoch in den Kopf gesetzt python zu lernen. Das hat auch mit einigen kleineren Projekten und Tutorials die man so findet schon ganz gut geklappt. Bei meinem aktuellen Projekt, einer App mit KivyMD, hänge ich aber irgendwie fest und hoffe auf eure Unterstützung.

Im Wesentlichen habe ich zwei, wahrscheinlich abhängige Probleme:
1) Auf einem Screen der App sollen anhand einer .csv Datei für jeden Eintrag ein Button mit dem Eintrag als Text erstellt werden.
Problem: Ich habe es leider nicht geschafft einen MDButton zur Laufzeit zu erstellen.
Hilfs-Lösung: Ich habe es geschafft normale Kivy-Buttons nach meinen Anforderungen zu erstellen :D

2) Durch Klick auf den jeweiligen Button soll es möglich sein, diesen Eintrag und Button zu löschen. Vor dem tatsächlichen löschen möchte ich gerne über ein MDDialog abfragen ob der Eintrag tatsächlich gelöscht werden soll.
Umsetzung: Hierfür habe ich den Code des Standard KivyMD-MDDialog Beispiels verwendet.
Problem: Als callback bekomme ich nun nicht wie gedacht "yes" oder "cancel" zurück, sondern <kivymd.uix.dialog.MDDialog object at 0x0000016DCE2ED3C8>. Da das Beispiel tadelos funktioniert und ich die richtigen Antworten bekomme, vermute ich, dass mein Problem aus der Hilfs-Lösung unter 1) resultiert.

Kann mir hierbei jemand helfen und ggf.
a) sagen, wie ich KivyMD-Widgets bzw. konkret MDButtons zur Laufzeit erstelle?
b) falls dies nicht möglich ist, wie ich dennoch herausbekomme welche Antwort im MDDialog gegeben wurde?
c) falls beides nicht geht einen Tipp geben wie ich meine Anforderungen umsetzen kann? Auf dem Screen müssen nicht zwangsläufig Buttons aufgeführt sein. Hauptanforderung ist eigentlich, dass jeder Eintrag der .csv gelistet ist und ich einzelne Einträge auswählen und löschen kann. Buttons waren dort mein zweckmäßigster Ansatz. Falls es einfacher geht bin ich auch hier für Anregungen dankbar.

Vielen Dank vorab für eure Hilfe.

Code: Alles auswählen

from kivy.lang import Builder
from kivymd.app import MDApp

import pandas as pd
from pathlib import Path
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button

from kivymd.uix.dialog import MDDialog

root_kv = """
Screen:
    BoxLayout:
        orientation: 'vertical'

        ScreenManager:
            id: screen_manager
            Screen
                name: "screen1"
                id: ID_screen1

"""

class MainApp(MDApp):

    def __init__(self, **kwargs):
        self.title = "My App"

        super().__init__(**kwargs)

    def build(self):
        self.root = Builder.load_string(root_kv)
        self.create_Layout()

    def create_Layout(self):
        my_file = Path("File1.csv")
        if my_file.is_file():
            df = pd.read_csv('File1.csv', header=0)
            grid = GridLayout(cols=1)
            for x in range(len(df)):
                satz = df.loc[x]
                wert0 = satz.get(0)
                wert1 = satz.get(1)
                wert2 = satz.get(2)
                wert3 = satz.get(3)
                wert4 = satz.get(4)
                Eintrag = str(wert1) + ":  " + str(wert0) + "    " + str(wert2) + " - " + str(wert3) + "    " + str(
                    wert4)

                btn = Button(text=Eintrag, size_hint=(.9, None), on_release=MainApp.show_example_okcancel_dialog)
                grid.add_widget(btn)
            self.root.ids.ID_screen1.add_widget(grid)

    def callback_for_menu_items(self, *args):
        print(args[0])


    def show_example_okcancel_dialog(self):
        dialog = MDDialog(
            title="Title",
            size_hint=(0.8, 0.3),
            text_button_ok="Yes",
            text="Your [color=%s][b]text[/b][/color] dialog",
            text_button_cancel="Cancel",
            events_callback=MainApp.callback_for_menu_items,
        )
        dialog.open()

if __name__ == "__main__":
    MainApp().run()
Antworten