Seite 1 von 1

Mehrere Buttons... eine Funktion

Verfasst: Dienstag 8. März 2022, 11:15
von madddiin
Hallo zusammen,

ich komme eigentlich von Swift und Mac Programmierung (Kein Pro). Hier war ich es gewohnt, meine GUI mit Xcode zu erstellen.

Wenn ich mehrere Buttons hatte, konnte ich am Tag des Buttons unterscheiden, welcher Button gedrückt wurde.

Das suche ich jetzt auch in Tkinter. Versuche es mal zu erklären.

Ich habe mehrere Entries und Label. Nun habe ich daneben einen Button stehen, um den Wert in die Zwischenablage zu übernehmen. Es ist ein Tool, dass mir Strings erstellt aus eingegebenen Daten. Stand jetzt habe ich pro Button eine Funktion geschrieben. Alle machen sie aber dass selbe. Einfach nur den Inhalt des Entry/Label in die Zwischenablage zu übernehmen.

In Xcode schrieb ich dann eine Action... und habe den Button aufgrund seines Tags unterschieden. Wie mache ich das in Python/Tkinter.

Also eine Funktion, nenne sie mal 'copy_to_clipboard'. Diese soll dann abhängig vom gedrücktem Button der Funktion "mitteilen", welcher Button gedrückt wurde.

Ich hoffe, es nicht zu kompliziert beschrieben zu haben.

Danke

Re: Mehrere Buttons... eine Funktion

Verfasst: Dienstag 8. März 2022, 11:32
von Sirius3
Am besten zeigst Du den Code, den Du geschrieben hast, dann kann man anhand dessen auch Verbesserungsvorschläge machen.
Wie Du es beschreibst, ist das Entry ein Argument, das man per functools.partial an `copy_to_clipboard` übergeben kann.

Re: Mehrere Buttons... eine Funktion

Verfasst: Dienstag 8. März 2022, 11:35
von __deets__
Der Weg der da üblicherweise beschritten wird besteht in „functools.partial“. Du schreibst deine vielen in eine Funktion um, die das Tag als Parameter bekommt. Und an der Stelle wo du das command anlegst, übergibst du ein mit partial aus der Funktion und einem Tag gebildetes callable, womit du deine Unterscheidung hast.

Re: Mehrere Buttons... eine Funktion

Verfasst: Dienstag 8. März 2022, 12:47
von madddiin
button_copy_gls_recipient_id = ttk.Button(output_gls_data_frame, text="Daten kopieren",
command=copy_text_dehner_market_to_clipboard)
button_copy_gls_recipient_id.grid(column=7, row=0, sticky="NE", padx=5, pady=5)

button_copy_gls_devicename = ttk.Button(output_gls_data_frame, text="Daten kopieren",
command=copy_text_gls_device_name_to_clipboard)
button_copy_gls_devicename.grid(column=7, row=1, sticky="NE", padx=5, pady=5)
Sirius3 hat geschrieben: Dienstag 8. März 2022, 11:32 Am besten zeigst Du den Code, den Du geschrieben hast, dann kann man anhand dessen auch Verbesserungsvorschläge machen.
Wie Du es beschreibst, ist das Entry ein Argument, das man per functools.partial an `copy_to_clipboard` übergeben kann.
Danke für das Feedback...

Hier mal die Funktionen und die Buttons dazu. Ich habe noch keine Klassen für geschrieben, um die App, die Frames etc. zu kapseln. Soweit bin ich noch nicht.

def copy_text_m42_to_clipboard() -> None:
root.clipboard_clear()
root.clipboard_append(text_m42.get("1.0", 'end-1c'))


def copy_text_dehner_market_to_clipboard() -> None:
root.clipboard_clear()
root.clipboard_append(text_dehner_market.get("1.0", 'end-1c'))


def copy_text_gls_device_name_to_clipboard() -> None:
root.clipboard_clear()
root.clipboard_append(text_gls_device_name.get("1.0", 'end-1c'))

und so habe ich die Buttons erstellt:

button_copy_m42_text = ttk.Button(output_m42_data_frame, text="Daten kopieren", command=copy_text_m42_to_clipboard)
button_copy_m42_text.grid(column=7, row=0, sticky="NE", padx=10, pady=10)

button_copy_gls_recipient_id = ttk.Button(output_gls_data_frame, text="Daten kopieren", command=copy_text_dehner_market_to_clipboard)
button_copy_gls_recipient_id.grid(column=7, row=0, sticky="NE", padx=5, pady=5)

button_copy_gls_devicename = ttk.Button(output_gls_data_frame, text="Daten kopieren", command=copy_text_gls_device_name_to_clipboard)
button_copy_gls_devicename.grid(column=7, row=1, sticky="NE", padx=5, pady=5)

Ich hoffe, dass es in Ordnung in den Code ohne Formatierung eingefügt zu haben.

Gruß

Martin

Re: Mehrere Buttons... eine Funktion

Verfasst: Dienstag 8. März 2022, 12:48
von madddiin
__deets__ hat geschrieben: Dienstag 8. März 2022, 11:35 Der Weg der da üblicherweise beschritten wird besteht in „functools.partial“. Du schreibst deine vielen in eine Funktion um, die das Tag als Parameter bekommt. Und an der Stelle wo du das command anlegst, übergibst du ein mit partial aus der Funktion und einem Tag gebildetes callable, womit du deine Unterscheidung hast.
Vielen Dank... das schaue ich mir gleich an.

Re: Mehrere Buttons... eine Funktion

Verfasst: Dienstag 8. März 2022, 13:40
von Sirius3
Auch wenn Du keine Klassen definierst, darfst Du trotzdem keine globalen Variablen verwenden, und wenn Du die Variablen sauber als Parameter übergibst, bist Du schon fertig, weil Du dann merkst, dass alle drei Funktionen identisch sind:

Code: Alles auswählen

from functools import partial

def copy_text_to_clipboard(text):
    text.clipboard_clear()
    text.clipboard_append(text.get("1.0", 'end-1c'))

def main():
    ...
    ttk.Button(output_m42_data_frame, text="Daten kopieren",
        command=partial(copy_text_to_clipboard, text_m42
    ).grid(column=7, row=0, sticky="NE", padx=10, pady=10)
    ttk.Button(output_gls_data_frame, text="Daten kopieren",
        command=partial(copy_text_to_clipboard, text_dehner_market)
    ).grid(column=7, row=0, sticky="NE", padx=5, pady=5)
    ttk.Button(output_gls_data_frame, text="Daten kopieren",  command=partial(copy_text_to_clipboard, text_gls_device)
    ).grid(column=7, row=1, sticky="NE", padx=5, pady=5)
    ...

if __name__ == "__main__":
    main()

Re: Mehrere Buttons... eine Funktion

Verfasst: Mittwoch 9. März 2022, 16:19
von madddiin
Sirius3 hat geschrieben: Dienstag 8. März 2022, 13:40 Auch wenn Du keine Klassen definierst, darfst Du trotzdem keine globalen Variablen verwenden, und wenn Du die Variablen sauber als Parameter übergibst, bist Du schon fertig, weil Du dann merkst, dass alle drei Funktionen identisch sind:
Vielen Dank für dein Beispiel. Hilft mir sehr.