Kivy Drag and Drop

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
minatronic
User
Beiträge: 3
Registriert: Dienstag 22. August 2023, 10:49

Hallo zusammen,
ich bin neu und habe kein Plan aber immerhin habe ich es geschafft mit Hilfe von Chat GPT ein Python Script mit einem Kivy GUI zu machen. Der Zweck des Scripts ist ganz einfach, es soll bei einer html Datei Text einfügen oder überschreiben. Ausser der width and height und einem Link sind es immer die gleichen Änderungen.
Das Script, dass ich hinbekommen habe funktioniert mit einer Pfadeingabe und sieht so aus:

Code: Alles auswählen


from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.core.window import Window
import re

def modify_html_file(file_path, width_value, height_value, url_value):
    # Neuer Script-Tag
    new_script_tag = '<script src="https://s0.2mdn.net/ads/studio/cached_libs/createjs_2019.11.15_min.js"></script>\n'

    # Neuer Meta-Tag
    new_meta_tag = f'<meta name="ad.size" content="width={width_value},height={height_value}">\n'

    # Neuer Script-Inhalt
    new_script_content = f'<script type="text/javascript"> var clickTag = "{url_value}";</script>'

    # Neuer Anchor-Tag
    new_anchor_tag = '<a href="javascript:window.open(window.clickTag)">\n'

    # Dateipfad für die modifizierte Datei
    new_file_path = file_path.replace('.html', '_modified.html')

    with open(file_path, 'r') as file:
        lines = file.readlines()

    # Ersetzen des Script-Tags
    lines[15] = new_script_tag

    # Finden der Position zum Einfügen des Meta-Tags
    meta_index = 0
    for i, line in enumerate(lines):
        if line.strip().startswith('<meta'):
            meta_index = i
            break

    # Einfügen des Meta-Tags im Head-Bereich
    lines.insert(meta_index, new_meta_tag)

    # Finden der Position zum Einfügen des Script-Tags
    script_index = 0
    for i, line in enumerate(lines):
        if line.strip().startswith('</head>'):
            script_index = i
            break

    # Einfügen des Script-Tags im Head-Bereich
    lines.insert(script_index, new_script_content)

    # Finden der Position des Öffnungs- und Schließungs-Tags des Body-Bereichs
    body_open_index = 0
    body_close_index = 0
    for i, line in enumerate(lines):
        if line.strip() == '<body onload="init();" style="margin:0px;">':
            body_open_index = i
        if line.strip() == '</body>':
            body_close_index = i

    # Einfügen des Anchor-Tags nach dem Öffnungs-Tag des Body-Bereichs
    lines.insert(body_open_index + 1, new_anchor_tag)

    # Finden der Position der schließenden </div>-Tags
    div_close_index = 0
    for i, line in enumerate(lines):
        if line.strip() == '</div>' and lines[i + 1].strip() == '</div>':
            div_close_index = i + 1

    # Einfügen des schließenden </a>-Tags nach den schließenden </div>-Tags
    lines.insert(div_close_index + 1, '</a>\n')

    # Schreiben des modifizierten Inhalts in eine neue Datei
    with open(new_file_path, 'w') as file:
        file.writelines(lines)

    print(f"Die modifizierte Version wurde unter '{new_file_path}' gespeichert.")

class HTMLModifierApp(App):
    def build(self):
        layout = BoxLayout(orientation='vertical', spacing=10, padding=10)
        
        self.file_label = Label(text="HTML-Dateipfad:")
        self.file_input = TextInput(multiline=False)

        self.width_label = Label(text="Breite:")
        self.width_input = TextInput(multiline=False)

        self.height_label = Label(text="Höhe:")
        self.height_input = TextInput(multiline=False)

        self.url_label = Label(text="URL:")
        self.url_input = TextInput(multiline=False)

        self.modify_button = Button(text="HTML-Datei modifizieren", on_press=self.modify_html)

        layout.add_widget(self.file_label)
        layout.add_widget(self.file_input)
        layout.add_widget(self.width_label)
        layout.add_widget(self.width_input)
        layout.add_widget(self.height_label)
        layout.add_widget(self.height_input)
        layout.add_widget(self.url_label)
        layout.add_widget(self.url_input)
        layout.add_widget(self.modify_button)

        return layout

    def modify_html(self, instance):
        html_file_path = self.file_input.text
        width_value = self.width_input.text
        height_value = self.height_input.text
        url_value = self.url_input.text

        modify_html_file(html_file_path, width_value, height_value, url_value)

if __name__ == '__main__':
    HTMLModifierApp().run()

Um mein Leben noch einfacher zu machen wäre es super eine Drag and Drop Funktion zu haben anstelle der Pfadeingabe.
Auch das habe ich fast hinbekommen. Aber irgendwie funktioniert das Drop nicht. Kann mir jemand sagen, wo der Fehler liegt?

Code: Alles auswählen

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.filechooser import FileChooserListView
from kivy.core.window import Window
import re



class HTMLModifierApp(App):
    def build(self):
        # ... (other code)
        layout = BoxLayout(orientation='vertical', spacing=10, padding=10)
        
        self.drop_label = Label(text="Datei hierhin ziehen", size_hint_y=None, height=40)
        self.width_input = TextInput(hint_text="Breite eingeben", multiline=False)
        self.height_input = TextInput(hint_text="Höhe eingeben", multiline=False)
        self.url_input = TextInput(hint_text="URL eingeben", multiline=False)
        self.apply_button = Button(text="Anpassungen anwenden", on_press=self.modify_html)
        self.result_label = Label(text="", size_hint_y=None, height=40)
        self.file_chooser = FileChooserListView(path='.')
        self.file_chooser.bind(selection=self.select_file)

        layout.add_widget(self.drop_label)
        layout.add_widget(self.width_input)
        layout.add_widget(self.height_input)
        layout.add_widget(self.url_input)
        layout.add_widget(self.apply_button)
        layout.add_widget(self.result_label)
        layout.add_widget(self.file_chooser)

        Window.bind(on_drop_file=self.on_drop_file)  # Bind the on_drop_file event

        return layout

    def modify_html(self, instance):
        if self.file_chooser.selection:
            html_file_path = self.file_chooser.selection[0]
            width_value = self.width_input.text
            height_value = self.height_input.text
            url_value = self.url_input.text

            modify_html_file(html_file_path, width_value, height_value, url_value)

        else:
            self.result_label.text = "Bitte wählen Sie eine Datei aus, bevor Sie Änderungen anwenden."


    def select_file(self, selection):
        # This method is called when a file is selected in the FileChooser
        pass

    def on_drop_file(self, *args):
        # This method is called when a file is dropped onto the app window
        pass

if __name__ == '__main__':
    HTMLModifierApp().run()
Ach ja, ich bin auf dem Mac unterwegs.

Liebe Grüsse und nicht zu streng mit mir sein. Ich gebe euch gerne Tipps bei Grafischen Fragen (-:
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Es wird echt Zeit eine Standardantwort zu Fragen, die mit aus ChatGPT erzeugtem Code gestellt werden, aufzusetzen.

Da du ja im grafischen Bereich unterwegs bist, vielleicht mal eine Analogie: wie faendest du das, wenn du statt einem Auftrag in Hoehe X damit konfrontiert wirdst, ein Stable Diffusion Bild zu retouchieren, bei dem die Haende weird sind, und auch diverse andere Dinge nicht passen? Nur weil der Auftraggeber da mal kurz was reingepromptet hat, und irgendwas zurueckbekommen hat. Und das ganze natuerlich fuer lau oder saubillig, weil die Hauptarbeit ist ja schon gemacht!

Stimmt halt nicht. Du hast nicht wirklich was. Wenn ChatGPT dir ein laufendes Programm fuer ein Problem geliefert hat, super. Gut fuer dich. Genauso wie mein Stable-Diffusion-Bild fuer die Halloween-Einladung ausreichend war.

Wenn das aber wirklich was koennen soll, und ueberarbeitet werden, und weiter entwickelt. dann hast du genau garnix. Dann muss jeder damit wieder neu von vorne anfangen, und es richtig machen. Vielleicht mit etwas ChatGPT-Unterstuetzung fuer Kleinkram. Aber es ist KEINE kleine Aenderung. Es bedeuet von vorne anzufangen.

Und das wird nicht passieren. Niemand(*) arbeitet stundenlang fuer andere, nur so aus Lust und Laune. Tust du auch nicht. Wir helfen dir, Programmieren zu lernen. Weil wir selbst mal klein angefangen haben. Aber nicht eine kaum brauchbare Skizze in ein schickes Gemaelde zu verwandeln.

(*) Kann passieren, wenn das Problem irgendwie persoenlich interessant oder relevant ist, aber das passiert sehr selten.
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ein Post, der das meiner Meinung nach sehr gut zusammenfasst: https://sambleckley.com/writing/dont-fi ... rator.html

Der erste Teil ist eher technisch. Aber im zweiten Teil mit den Vorhersagen wird es klar & nachvollziehbar:

An opinion popular with creatives and
unpopular with techy managers: Genera-
tive AI isn’t much use for sophisticated
needs if there isn’t an illustrator involved.

Illustrator durch Programmierer ersetzen, und es passt hier.
minatronic
User
Beiträge: 3
Registriert: Dienstag 22. August 2023, 10:49

Hallo,
ich frage mich gerade, ob es die gleichen Antwort gäbe, wenn Chat GPT nicht erwähnt worden wäre?
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die gleiche? Nein. Aber eine sehr aenhliche, sicher. Das Problem, dass sich hier Leute ohne eigene Kenntnis, und ohne Willen, daran was zu aendern, etwas programmieren lassen wollen, ist ja nicht gerade neu.. siehe viewtopic.php?t=1689

Und eher frueher als spaeter faellt eben auf, das man eigentlich nix kann. Das dauert dann ggf. laenger, klar. Aber ob man nun seine und die Zeit anderer Leute so verschwenden will, darf man zwischen sich und dem eigenen Karma ausmachen.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei man IMHO auch so langsam ein Gefühl dafür entwickelt ChatGPT-generierten Quelltext als solchen zu erkennen. Insbesondere dann auch mit den Reaktionen der Fragesteller auf Verbesserungsvorschläge wo schnell klar wird, dass das nicht selbst geschrieben ist/war, und dann ist auch egal ob das von ChatGPT oder einer anderen Fremdquelle kommt — die wenigsten haben Lust einfach nur fremden Quelltext zu flicken ohne das der Fragesteller danach besser programmieren kann.

Bei ChatGPT ist für Fragesteller die absolute Anfänger sind, halt besonders ungünstig, dass das zwar oft halbwegs funktionierende recht umfangreiche Lösungen produziert, auf der anderen Seite aber Fehler macht oder Wege wählt, die jemand der das selbst geschrieben hätte, entweder so nicht geschrieben hätte, oder aber leicht in der Lage sein müsste das gerade zu ziehen.

Dazu kommt noch das man die Qualität des Codes und ob der im allgemeinen überhaupt fehlerfrei ist, nur beurteilen kann, wenn man das alles soweit verstanden hat, dass man es auch komplett selbst hätte schreiben können. Was gerade absolute Anfänger natürlich nicht können, eben weil sie absolute Anfänger sind.

Ganz konkret bei dem hier vorliegenden Beispiel hätte ich schon deswegen keine Lust irgend etwas an einer GUI zu machen solange die Programmlogik HTML-Dateien als Zeilen mit Zeichenketten verarbeitet, statt da einen Parser zu verwenden und ordentlich auf der Struktur der Dokumente zu operieren. Das das `re`-Modul nur importiert, aber nicht verwendet wird, ist nett, aber nicht ausreichend.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der zweite Code hat auch offensichliche Fehler, die klarmachen: wenn man den geschrieben haette, waere das nicht passiert.
minatronic
User
Beiträge: 3
Registriert: Dienstag 22. August 2023, 10:49

Guten Morgen,

Eine Antwort wie:

Der Code ist absolut unbrauchbar such dir besser jemand der Programmieren kann.
Ich kann dir ein Angebot machen wenn du willst.

Wäre für mich auch OK gewesen.

Never Mind.
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Code ist absolut unbrauchbar. Such dir besser jemanden, der Programmieren kann. Ein Angebot von mir kannst du dir nicht leisten.

Jetzt besser?
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@minatronic: Wie schon gesagt, solche Antworten gibt es hier nicht. Ich denke das würde Leser auch abschrecken wenn man statt Hinweisen wie man den Code besser machen kann, mit kommerziellen Angeboten kommen würde, oder sie weg schickt, sich jemanden zu suchen der das für sie programmiert.

Hier gibt es Hilfe zur Selbsthilfe, für Leute die Interesse an der Programmiersprache Python haben.

Ich habe mir jetzt mal den zweiten Quelltext im ersten Beitrag angeschaut und was „Drag and Drop“ angeht funktioniert der Teil an sich ja. Natürlich passiert da nichts weiter, aber genau das steht dort im Code, das nichts passieren soll wenn eine Datei auf das Fenster gezogen wird.

Bei Änderung der Auswahl im `FileChooserListView` passiert auch explizit nichts. Was damit eher sinnlos ist. Vielleicht *sollte* da etwas passieren‽

Das Label mit dem Text man solle die Datei da drauf ziehen ist ein bisschen irreführend, weil das gesamte Fenster das Ziel ist, nicht nur dieses Label.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten