Mehrere Buttons... eine Funktion

Fragen zu Tkinter.
Antworten
Benutzeravatar
madddiin
User
Beiträge: 12
Registriert: Donnerstag 15. Oktober 2020, 17:39

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
Weg von Excel VBA... hin zu Python.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
madddiin
User
Beiträge: 12
Registriert: Donnerstag 15. Oktober 2020, 17:39

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
Weg von Excel VBA... hin zu Python.
Benutzeravatar
madddiin
User
Beiträge: 12
Registriert: Donnerstag 15. Oktober 2020, 17:39

__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.
Weg von Excel VBA... hin zu Python.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

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()
Benutzeravatar
madddiin
User
Beiträge: 12
Registriert: Donnerstag 15. Oktober 2020, 17:39

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.
Weg von Excel VBA... hin zu Python.
Antworten