event.widget in callbacks von menüeinträgen
Verfasst: Dienstag 6. Oktober 2009, 14:53
Hi allerseits ^^
Ich bin jetzt schon zwei Tage lang auf der Suche nach einer Lösung für ein Problem mit meinem Tkinter-Programm, konnte sie aber bisher nicht finden.
Vorneweg möchte ich mich entschuldigen, dass ich keine Code-Ausschnitte posten kann, aber das Programm ist für eine Bachelorarbeit und dementsprechend so umfangreich, dass ich nicht denke dass ich da aus dem Code das Problem richtig herausarbeiten kann.
Stattdessen will ich einfach versuchen so genau wie möglich zu beschreiben was ich vor habe, warum es nicht anders geht bzw ich es nicht anders haben möchte, wenn es irgendwie so geht, wie ich es mir vorgestellt habe und was das Problem dabei ist.
So, lange Rede, kurzer Sinn, kommen wir ans Eingemachte.
Was ich tun möchte ist zu jedem widget in meinem programm mit Rechtsklick ein Kontextmenü zu anzuzeigen, dessen inhalt von dem angeklickten widget abhängig ist (u.a. um eigenschaften dieses widgets anzuzeigen und zu ändern).
So weit kein Problem, aber ich möchte, dass das auch für Menüs und Menüeinträge funktioniert, wobei man letztere in Tkinter ja strenggenommen nie als "widget"-objekte geliefert bekommt. Dementsprechend kann ich auch nicht individuell für einen Menüeintrag die bind-methode verwenden, sondern muss mit bind_all arbeiten. (Falls ich mich da irren sollte und es gibt doch einen weg einem menü_eintrag_ ein callback zuzuweisen für <Button-3>, sagt es mir ^^)
So, auch das wäre eigentlich kein Problem bisher. Man bekommt ja, wenn man ein callback über bind-methoden registiert ein Event-Objekt mit dem man zugriff auf all die netten Attribute hat, die man braucht - theoretisch.
Das Attribut für das ich mich jetzt im speziellen interessiere ist natürlich das "widget"-attribut, weil ich die Eigenschaften der widgets ja brauche um zu entscheiden welches Kontextmenü angezeigt wird bzw wie dieses aussieht,
Greife ich aber auf widget.event zu, wenn das Event von einem Menu-Objekt oder einem Menüeintrag kommt, bekomme ich kein Widget-Objekt mit Attributen und Methoden, sondern nur einen str-Objekt, dessen Inhalt in etwa zum Beispiel so aussieht ".#164828300" bei einem Menu-Objekt oder so ".#164828300.#164828300#164828396" bei einem Eintrag.
Das sieht ja sehr nach einem Benennungssystem aus wie es in Tkinter auch bei "normalen" widgets existiert, wenn man das Widget zu einem String umwandelt oder widget.winfo_name() aufruft. Augenscheinlich hilft hier aber nametowidget auch nicht weiter, denn das wirft einen Fehler wenn ich es auf dem Tk-Objekt aufrufe und mit diesen seltsamen Menu-Strings füttere.
Ich bräuchte also irgendeinen Weg, wie ich von diesen Bezeichnern aus dem event.widget Feld zu einem "benutzbaren" Hinweis auf den angeklickten Menü-Eintrag komme, sei das nun das label des Eintrags, der Index im Menu oder was auch immer.
Ich bin sogar schon so weit gegangen, dass ich versucht habe, einfach als command für die Menüeinträge eine Funktion übergeben habe, die jeweils dann in einer Variable speichert welcher Eintrag zuletzt geklickt wurde, aber da das übergebene command erst _nach_ dem callback für das <Button-3>-Event ausgeführt wird bringt das auch wieder nichts, da ich dann die Information ja erst bekomme nachdem ich sie schon lange gebraucht hätte.
Eine Tkinter-Erweiterung mit anderen Menu-Widgets kommt für mich erst als letzte Option in Frage, weil es für das Programm ziemlich wichtig ist, dass es ohne viele zusätzliche software auskommen und bestenfalls auf jedem Linux-Rechner mit python laufen soll. Wenn da jemand eine gute Alternative kennt, wäre ich über den Hinweis aber natürlich auch dankbar.
Ich bedanke mich schon einmal im vorraus und hoffe wirklich, dass ihr mir hier weiterhelfen könnt. Ihr seid sozusagen meine letzte Hoffnung. ^^
freundliche Grüße
Prophet
P.S. :
Sollte etwas bei meiner Beschreibung noch unklar sein, fragt mich bitte. Ich denke wir kennen ja alle die Probleme von Fragestellungen ohne den zugehörigen Programmcode. ^^
Ich bin jetzt schon zwei Tage lang auf der Suche nach einer Lösung für ein Problem mit meinem Tkinter-Programm, konnte sie aber bisher nicht finden.
Vorneweg möchte ich mich entschuldigen, dass ich keine Code-Ausschnitte posten kann, aber das Programm ist für eine Bachelorarbeit und dementsprechend so umfangreich, dass ich nicht denke dass ich da aus dem Code das Problem richtig herausarbeiten kann.
Stattdessen will ich einfach versuchen so genau wie möglich zu beschreiben was ich vor habe, warum es nicht anders geht bzw ich es nicht anders haben möchte, wenn es irgendwie so geht, wie ich es mir vorgestellt habe und was das Problem dabei ist.
So, lange Rede, kurzer Sinn, kommen wir ans Eingemachte.
Was ich tun möchte ist zu jedem widget in meinem programm mit Rechtsklick ein Kontextmenü zu anzuzeigen, dessen inhalt von dem angeklickten widget abhängig ist (u.a. um eigenschaften dieses widgets anzuzeigen und zu ändern).
So weit kein Problem, aber ich möchte, dass das auch für Menüs und Menüeinträge funktioniert, wobei man letztere in Tkinter ja strenggenommen nie als "widget"-objekte geliefert bekommt. Dementsprechend kann ich auch nicht individuell für einen Menüeintrag die bind-methode verwenden, sondern muss mit bind_all arbeiten. (Falls ich mich da irren sollte und es gibt doch einen weg einem menü_eintrag_ ein callback zuzuweisen für <Button-3>, sagt es mir ^^)
So, auch das wäre eigentlich kein Problem bisher. Man bekommt ja, wenn man ein callback über bind-methoden registiert ein Event-Objekt mit dem man zugriff auf all die netten Attribute hat, die man braucht - theoretisch.
Das Attribut für das ich mich jetzt im speziellen interessiere ist natürlich das "widget"-attribut, weil ich die Eigenschaften der widgets ja brauche um zu entscheiden welches Kontextmenü angezeigt wird bzw wie dieses aussieht,
Greife ich aber auf widget.event zu, wenn das Event von einem Menu-Objekt oder einem Menüeintrag kommt, bekomme ich kein Widget-Objekt mit Attributen und Methoden, sondern nur einen str-Objekt, dessen Inhalt in etwa zum Beispiel so aussieht ".#164828300" bei einem Menu-Objekt oder so ".#164828300.#164828300#164828396" bei einem Eintrag.
Das sieht ja sehr nach einem Benennungssystem aus wie es in Tkinter auch bei "normalen" widgets existiert, wenn man das Widget zu einem String umwandelt oder widget.winfo_name() aufruft. Augenscheinlich hilft hier aber nametowidget auch nicht weiter, denn das wirft einen Fehler wenn ich es auf dem Tk-Objekt aufrufe und mit diesen seltsamen Menu-Strings füttere.
Ich bräuchte also irgendeinen Weg, wie ich von diesen Bezeichnern aus dem event.widget Feld zu einem "benutzbaren" Hinweis auf den angeklickten Menü-Eintrag komme, sei das nun das label des Eintrags, der Index im Menu oder was auch immer.
Ich bin sogar schon so weit gegangen, dass ich versucht habe, einfach als command für die Menüeinträge eine Funktion übergeben habe, die jeweils dann in einer Variable speichert welcher Eintrag zuletzt geklickt wurde, aber da das übergebene command erst _nach_ dem callback für das <Button-3>-Event ausgeführt wird bringt das auch wieder nichts, da ich dann die Information ja erst bekomme nachdem ich sie schon lange gebraucht hätte.
Eine Tkinter-Erweiterung mit anderen Menu-Widgets kommt für mich erst als letzte Option in Frage, weil es für das Programm ziemlich wichtig ist, dass es ohne viele zusätzliche software auskommen und bestenfalls auf jedem Linux-Rechner mit python laufen soll. Wenn da jemand eine gute Alternative kennt, wäre ich über den Hinweis aber natürlich auch dankbar.
Ich bedanke mich schon einmal im vorraus und hoffe wirklich, dass ihr mir hier weiterhelfen könnt. Ihr seid sozusagen meine letzte Hoffnung. ^^
freundliche Grüße
Prophet
P.S. :
Sollte etwas bei meiner Beschreibung noch unklar sein, fragt mich bitte. Ich denke wir kennen ja alle die Probleme von Fragestellungen ohne den zugehörigen Programmcode. ^^