Innerhalb einer Funktion auslösenden Button ermitteln

Fragen zu Tkinter.
Windy
User
Beiträge: 4
Registriert: Montag 17. Juli 2017, 11:45

Innerhalb einer Funktion auslösenden Button ermitteln

Beitragvon Windy » Montag 17. Juli 2017, 12:09

Hallo,

hab da mal eine Abfängerfrage.

Kann man innerhalb einer Funktion ermitteln welcher Button die Funktion aufgerufen hat?
Ich möchte mit mehreren Buttons die gleiche Funktion aufrufen und innerhalb der Funktion den Button ermitteln.

Vielen Dank im Voraus
Windy
Benutzeravatar
BlackJack
Moderator
Beiträge: 32710
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: Innerhalb einer Funktion auslösenden Button ermitteln

Beitragvon BlackJack » Montag 17. Juli 2017, 12:50

@Windy: Willst Du wirklich den Button ermitteln oder einen anderen Wert der damit zusammenhängt? Egal was, Du solltest es nicht in der Funktion/Methode ermitteln sondern als Argument übergeben lassen. Schau Dir mal `functools.partial()` an.
“XML combines all the inefficiency of text-based formats with most of the unreadability of binary formats :-)” — Oren Tirosh, c.l.p, 2002
Windy
User
Beiträge: 4
Registriert: Montag 17. Juli 2017, 11:45

Re: Innerhalb einer Funktion auslösenden Button ermitteln

Beitragvon Windy » Montag 17. Juli 2017, 13:55

  1. from tkinter import *
  2. from tkinter import ttk
  3. import functools
  4.  
  5. def ereignis(nr):
  6.     print(nr)
  7.  
  8. fenster = Tk()
  9. a = Button(fenster, text='a', command=functools.partial(ereignis, '1'))
  10. a.place(x=10, y= 10)
  11.  
  12. b = Button(fenster, text='b', command=functools.partial(ereignis, '2'))
  13. b.place(x=50, y= 10)
  14.  
  15. fenster.geometry("2000x1000")
  16. fenster.mainloop()


Sieht ungewöhnlich aus, funktioniert aber.

Dake für den Tipp

Gruß
Windy
Zuletzt geändert von BlackJack am Montag 17. Juli 2017, 18:33, insgesamt 2-mal geändert.
Grund: Aufrufklammern hinter `mainloop` gesetzt.
Benutzeravatar
BlackJack
Moderator
Beiträge: 32710
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: Innerhalb einer Funktion auslösenden Button ermitteln

Beitragvon BlackJack » Montag 17. Juli 2017, 14:45

@Windy: Den Sternchen-Import und `place()` solltest Du loswerden. Mit Sternchen-Importen wird es schnell unübersichtlich so Namen herkommen und es besteht auch die Gefahr von Namenskollisionen. `place()` macht nur in sehr wenigen Fällen Sinn, und ansonsten im besten Fall nur Arbeit und im schlechten Fall unbenutzbare GUIs auf Systemen mit anderen Einstellungen.

Sind die Klammern für den Aufruf bei `mainloop()` beim kopieren verloren gegangen?
“XML combines all the inefficiency of text-based formats with most of the unreadability of binary formats :-)” — Oren Tirosh, c.l.p, 2002
Windy
User
Beiträge: 4
Registriert: Montag 17. Juli 2017, 11:45

Re: Innerhalb einer Funktion auslösenden Button ermitteln

Beitragvon Windy » Montag 17. Juli 2017, 15:07

Hi,

dass mit dem mainloop() ist mir bis jetzt nie aufgefallen, da es keinen Fehler gab.

Das mit dem Sternchen ist bekannt. Versuche mich gerade etwas in Tkinter einzuarbeiten
und das sind Testscripte, die ich gerade schreibe.

Habe mir bereits die drei Möglichkeiten der Plazierung angesehen und mir ist persönlich
einfach die direkte Plazierung am sympathischsten.

Danke für die Hilfe
Gruß
Windy

PS. kann es sein, dass wenn Du als Admin in meinem Beitrag etwas änderst, dass ich dann keinen zugriff mehr auf eben diesen habe?
Benutzeravatar
BlackJack
Moderator
Beiträge: 32710
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: Innerhalb einer Funktion auslösenden Button ermitteln

Beitragvon BlackJack » Montag 17. Juli 2017, 15:41

@Windy: Ich glaube nicht das eine Veränderung als Admin den Beitrag sperrt — nach 5 Minuten wird der automatisch gesperrt. Wir hatten mal jemanden der meinte Diskussionen nachträglich verändern zu müssen und Spammer nerven auch manchmal in dem sie erst harmlose Beiträge erstellen und die dann wenn keiner mehr hinschaut nach einiger Zeit den Text mit Werbelinks ersetzen.

Wenn Dir das mit der `mainloop()` noch nie aufgefallen ist, hast Du so ein Programm wohl noch nie ausserhalb einer IDE aufgerufen die das irgendwie im Hintergrund für Dich löst. :-)

Die direkte Platzierung funktioniert nicht wirklich weil die Leute sehr unterschiedliche Bildschirmgrössen und -auflösungen und dementsprechend auch Pixelgrössen und Schriftgrössen und so weiter haben. Das was bei Dir richtig aussieht, kann bei jemand anderen so ungünstig ineinander Verschoben angezeigt werden, das die GUI nicht mehr richtig bedienbar ist. Und es ist auch massiv arbeitsaufwändig bei einer GUI nachträglich etwas einzufügen, zu entfernen, oder in der Grösse zu verändern oder zu verschieben, wenn man dann von Hand alles mögliche andere was dadurch dann auch verschoben werden muss, anpassen muss. Und zu guter letzt möchte man vielleicht auch mal programmatisch Inhalte ändern die Grössenänderungen nach sich ziehen. Zum Beispiel ein Programm mehrsprachig machen, wodurch sich dann die länge von Texten und damit auch die Grösse von `Button`\s, `Label`\s, usw. ändern.
“XML combines all the inefficiency of text-based formats with most of the unreadability of binary formats :-)” — Oren Tirosh, c.l.p, 2002
Windy
User
Beiträge: 4
Registriert: Montag 17. Juli 2017, 11:45

Re: Innerhalb einer Funktion auslösenden Button ermitteln

Beitragvon Windy » Montag 17. Juli 2017, 18:20

Hi,

wie gesagt ich teste bzw. experimentier etwas mit tkinter herum. Da kommt noch kein PRG zum weitergeben raus. Deswegen ist mir das mit den Klammern auch nicht aufgefallen. Darf ich dich nochmals bemühen, kannst Du sie nachträglich ins Skript reinpacken(die fehlenden Klammern). Ich kann es ja nicht mehr.

Danke nochmals

Viele Grüße
Windy

Zurück zu „Tkinter“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder