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
Mehrere Buttons... eine Funktion
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.
Wie Du es beschreibst, ist das Entry ein Argument, das man per functools.partial an `copy_to_clipboard` übergeben kann.
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.
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)
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
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)
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.
Vielen Dank... das schaue ich mir gleich an.__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.
Weg von Excel VBA... hin zu Python.
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()
Vielen Dank für dein Beispiel. Hilft mir sehr.
Weg von Excel VBA... hin zu Python.