taskbar icons und popup menus

Plattformunabhängige GUIs mit wxWidgets.
Antworten
sanostol
User
Beiträge: 11
Registriert: Sonntag 4. September 2005, 09:43

Mittwoch 5. Dezember 2007, 10:58

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Mittwoch 5. Dezember 2007, 11:20

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
:-)
[url]http://halvar.at[/url] | [url=http://halvar.at/elektronik/kleiner_bascom_avr_kurs/]Kleiner Bascom AVR Kurs[/url]
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BlackJack

Mittwoch 5. Dezember 2007, 11:24

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.
sanostol
User
Beiträge: 11
Registriert: Sonntag 4. September 2005, 09:43

Mittwoch 5. Dezember 2007, 12:02

vielen dank, werds gleich mal versuchen
sanostol
User
Beiträge: 11
Registriert: Sonntag 4. September 2005, 09:43

Mittwoch 5. Dezember 2007, 12:32

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
BlackJack

Mittwoch 5. Dezember 2007, 12:38

Dein Verdacht ist richtig: Die Methode wird jedesmal aufgerufen wenn das Kontextmenü angefordert wird.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Mittwoch 5. Dezember 2007, 12:42

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
:-)
[url]http://halvar.at[/url] | [url=http://halvar.at/elektronik/kleiner_bascom_avr_kurs/]Kleiner Bascom AVR Kurs[/url]
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sanostol
User
Beiträge: 11
Registriert: Sonntag 4. September 2005, 09:43

Mittwoch 5. Dezember 2007, 12:49

Nochmals danke!
Antworten