Seite 1 von 1

taskbar icons und popup menus

Verfasst: Mittwoch 5. Dezember 2007, 10:58
von sanostol
hallo,

ich versuche mich gerade and dem taskbar beispiel auf dieser seite:

http://wiki.wxpython.org/AnotherTutoria ... f3832085e4

kapitel 11

hier wird eine klasse von dem wx.TaskBarIcon abgeleitet, die die methoden __init__ und CreatePopupMenu hat. init ist klar aber CreatePopupMenu so gar nicht. die funktion wird nie aufgerufen aber es funktioniert trotzdem. wie funktioniert das. wo krieg ich mehr infos zu dem wx.TaskBarIcon. ich moechte das bei rechtsclick ein menu aufgeht. in dem unterschiedliche projecte zur auswahl stehen. und jedes mal wenn das menu aufgeht soll das programm die entsprechende database durchgehen und die menu punkte aktualisieren.

geht sowas?

martin

Re: taskbar icons und popup menus

Verfasst: Mittwoch 5. Dezember 2007, 11:20
von gerold
Hallo Martin!
sanostol hat geschrieben:wo krieg ich mehr infos zu dem wx.TaskBarIcon.
http://wxwidgets.org/manuals/stable/wx_ ... ricon.html
sanostol hat geschrieben:ich moechte das bei rechtsclick ein menu aufgeht. [...] jedes mal wenn das menu aufgeht soll das programm die entsprechende database durchgehen und die menu punkte aktualisieren. geht sowas?
Natürlich. Du musst nur *CreatePopupMenu* überschreiben und darin ein neues Menü mit den Einträgen erzeugen. Dieses kannst du dann mit *PopupMenu* anzeigen lassen.

mfg
Gerold
:-)

Verfasst: Mittwoch 5. Dezember 2007, 11:24
von BlackJack
wxTaskBarIcon::CreatePopupMenu wird aufgerufen wenn zu dem Icon ein Kontextmenu angefordert wird. Wenn ein Menu angezeigt werden soll, dann muss die Methode das `wx.Menu` liefern und wie man in dem Beispiel auf der Seite sieht, die Du verlinkt hast, kann man das Menu durchaus dynamisch erstellen.

Mehr Informationen gibt's in der Dokumentation zu wxWidgets. Die ist zwar für C++, aber die Python-Anbindung ist nur eine relativ dünne "Schicht" über der C++-API.

Verfasst: Mittwoch 5. Dezember 2007, 12:02
von sanostol
vielen dank, werds gleich mal versuchen

Verfasst: Mittwoch 5. Dezember 2007, 12:32
von sanostol
naja , irgendwie klemmts noch.

das mit dem dynamisch klappt einfach nicht. da stell ich mich bloed an. wenn ich zum beispiel in der CreatePopupMenu function einen eintrag hinzufuege klappt das aber wenn ich in einem event einen eintrag hinzufuegen will klappt das nicht. gleiche gilt fuer attribute wie enable

self.StopHarvesterNow.Enable(False)

funktioniert in der CreatePopupMenu funktion aber nicht in der

def StopHarvester(self, event):
obwohl sie aufgerufen wird. nur dass der menu eintrag beim naechsten mal immernoch aktiv ist

einen verdacht hab ich ja, die funktion CreatePopupMenu wird jedesmal neu auferufen. dann muesste ich selber die werte speichern und beim aufruf der createpopupmenu funktion auswerten

Verfasst: Mittwoch 5. Dezember 2007, 12:38
von BlackJack
Dein Verdacht ist richtig: Die Methode wird jedesmal aufgerufen wenn das Kontextmenü angefordert wird.

Verfasst: Mittwoch 5. Dezember 2007, 12:42
von gerold
sanostol hat geschrieben:das mit dem dynamisch klappt einfach nicht.
Hallo sanostol!

Mache eine klare Sache daraus: Verschmeiße jedes mal das alte Menü und erstelle jedes mal ein Neues. Dann musst du dir keine Gedanken über Nebeneffekte machen.

Am Besten, du erstellst dir eine Funktion, die dir das frisch generierte Menü zurück gibt. Diese Funktion rufst du in der *CreatePopupMenu()*-Methode auf um zu einem frischen Menü zu kommen. Dieses Menü kannst du dann per *PopupMenu()* anzeigen lassen. Sobald die Methode *CreatePopupMenu()* fertig ist, wird das PopupMenü automatisch wieder zerstört. Die Zustände der einzelnen Menüeinträge kannst du dir ja irgendwo zwischenspeichern.

mfg
Gerold
:-)

Verfasst: Mittwoch 5. Dezember 2007, 12:49
von sanostol
Nochmals danke!