2010-07-13 3 views
1

En utilisant wxPython, j'ai créé une icône et un menu dans la barre des tâches. Tout fonctionne correctement (sous Windows au moins) en faisant un clic droit sur l'icône: c'est-à-dire que le menu est affiché et automatiquement masqué lorsque vous cliquez ailleurs, comme dans la barre des tâches de Windows.wxPython: comment faire pour que l'icône de la barre des tâches réponde au clic gauche

Maintenant je veux que le menu apparaisse quand l'icône est également cliquée gauche. J'inséré un Bind() à un clic gauche dans l'emballage de classe Frame, en appelant la CreatePopupMenu() de l'icône de la barre des tâches:

import wx 
class BibTaskBarIcon(wx.TaskBarIcon): 
    def __init__(self, frame): 
     wx.TaskBarIcon.__init__(self) 
     self.frame = frame 
     icon = wx.Icon('test_icon.ico', wx.BITMAP_TYPE_ICO) 
     self.SetIcon(icon, "title") 

    def CreatePopupMenu(self): 
     self.menu = wx.Menu() 
     self.menu.Append(wx.NewId(), "dummy menu ") 
     self.menu.Append(wx.NewId(), "dummy menu 2") 
     return self.menu 

class TaskBarFrame(wx.Frame): 
    def __init__(self, parent, title): 
     wx.Frame.__init__(self, parent, style=wx.FRAME_NO_TASKBAR) 
     ... 
     self.tbicon = BibTaskBarIcon(self) 
     wx.EVT_TASKBAR_LEFT_UP(self.tbicon, self.OnTaskBarLeftClick) 
     ... 

    def OnTaskBarLeftClick(self, evt): 
     self.PopupMenu(self.tbicon.CreatePopupMenu()) 

    ... 
def main(argv=None): 
    app = wx.App(False) 
    TaskBarFrame(None, "testing frame") 
    app.MainLoop() 

Cela fonctionne bien, sauf que le menu ne disparaît pas automatiquement lorsque vous cliquez sur ailleurs sur votre écran. En fait, un clic gauche plusieurs fois sur l'icône crée plusieurs menus. La seule façon de cacher le (s) menu (s) est de cliquer sur l'un de ses éléments (ce que vous ne voulez pas toujours). J'ai regardé les méthodes disponibles de TaskbarIcon, mais j'ai échoué à savoir lequel utiliser pour masquer le menu (.Destroy() ne fonctionnait pas). De plus, je ne sais pas à quel événement le lier (il y a un EVT_SET_FOCUS, mais je n'ai pas trouvé de EVT_LOOSE_FOCUS ou similaire). Alors, comment cacher le menu après avoir perdu le focus?

EDIT: J'ai inséré un peu plus de code, pour le rendre plus clair

+0

Pouvez-vous indiquer ce qu'est BibTaskBarIcon? et il serait mieux si vous pouvez donner un code simple qui peut être exécuté sur copier-coller et affiche le problème –

+0

J'ai étendu le code un peu. Maintenant, il est prêt à copier-coller, sauf pour le fichier icône – Rabarberski

+0

Devinez que vous utilisez Windows depuis un clic ailleurs, même sur l'icône ferme le menu. (ubuntu) –

Répondre

3

Ah, je l'ai découvert ce qui a mal tourné. Dans l'instruction

self.PopupMenu(self.tbicon.CreatePopupMenu()) 

J'avais lié le menu contextuel à l'image, au lieu de l'icône de la barre des tâches.

En changeant à:

self.tbicon.PopupMenu(self.tbicon.CreatePopupMenu()) 

tout fonctionne bien maintenant.

Merci pour toutes les remarques

0

Je pense que le problème ici est que le PopupMenu est généralement utilisé dans le contexte d'un programme, et non une petite icône dans le système plateau. Cela signifie que dans un cadre normal, le menu contextuel détecterait le clic sur lequel vous avez cliqué. Ici, vous cliquez en dehors du programme wxPython. En outre, le PopupMenu est généralement utilisé avec EVT_CONTEXT_MENU, pas cet événement de la barre des tâches.

Vous pouvez essayer wx.EVT_KILL_FOCUS et voir si cela fonctionne car il devrait théoriquement se déclencher lorsque vous cliquez sur le menu. Ou vous pourriez demander sur le forum officiel wxPython ici: http://groups.google.com/group/wxpython-users/topics


Mike Driscoll

Blog: http://blog.pythonlibrary.org

Questions connexes