2010-07-01 5 views
2

Je souhaite ajouter des cases à cocher à un wxListCtrl et cela fonctionne correctement, sauf qu'il ne semble pas y avoir d'événement EVT_LIST_ITEM_CLICK ou EVT_LIST_ITEM_LEFT_CLICK à attraper lorsque la souris clique sur l'élément pour que l'image puisse être basculée. Il y a des événements pour le clic droit et le clic du milieu, mais pas le clic gauche - ce qui signifie que vous devez cliquer sur le bouton du milieu ou sur le bouton droit pour cocher/décocher les éléments de la liste.wxWidgets: Comment attraper un clic gauche sur wxListCtrl?

Est-ce que quelqu'un sait s'il existe un événement de clic gauche que vous pouvez utiliser? J'ai essayé l'élément sélectionné et les événements activés par l'élément, mais ceux-ci ne signalent pas l'emplacement du pixel de l'événement, donc je ne peux pas les utiliser pour déterminer si l'image était la partie de l'élément cliqué.

Je basais le code sur certains au the wxWidgets wiki, sauf qu'ils remplacent la classe wxListCtrl que je veux éviter pour plus de simplicité. Je suis également au courant de wxGrid et d'autres contrôles alternatifs, mais aucun d'eux n'est aussi rapide que le wxListCtrl (et les cases à cocher wxGrid semblent terribles aussi.)

Alors, quelqu'un sait-il comment vous pouvez obtenir les coordonnées de gauche- clique dans un wxListCtrl?

EDIT: Désolé, wxListCtrl pas wxListGrid (était trop dur à penser wxGrid ...)

Répondre

0

Ceci est la première fois que j'entends parler wxListGrid donc je ne sais pas quoi est-il capable. Cependant, en général, vous pouvez toujours attraper les événements de clic de souris de faible niveau (par exemple EVT_LEFT_UP) et trouver l'élément sous la position de la souris.

+0

Désolé qui était une faute de frappe, il était censé être wxListCtrl. J'ai essayé de capturer les événements EVT_LEFT_UP et EVT_LEFT_DOWN mais ceux-ci ne sont jamais envoyés par le wxListCtrl donc le code ne s'exécute jamais. – Malvineous

+1

Vous devriez vraiment utiliser 'EVT_LIST_ITEM_SELECTED' pour cette classe et' wxGetMousePosition() 'pour obtenir l'emplacement de la souris (qui ne sera pas exactement le même que pour l'événement de sélection mais devrait être assez proche). –

0

Voici les événements que je capture de mon ListCtrl pour un clic gauche et double clic:

self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnListClick, self.ballotC) 
self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnListDClick, self.ballotC) 

Vous pouvez voir un exemple here.

+0

Merci pour la suggestion - ce sont les éléments sélectionnés et les éléments déclenchés par les éléments auxquels je fais référence dans ma question, mais quand je les utilise la commande "print event.GetPosition()" affiche (0,0) pour moi quel que soit le clic eu lieu, donc je ne peux pas les utiliser. Avez-vous des coordonnées de ces événements? – Malvineous

+0

Je ne sais pas si vous pouvez obtenir le poste avec ces événements. Je suggère de modifier le titre de votre question et la phrase finale afin de préciser que vous recherchez les coordonnées du clic gauche. –

2

Je suis confus. Vous devriez pouvoir lier EVT_LEFT_DOWN exactement comme avec n'importe quel autre widget. Je l'ai juste essayé et ça a marché pour moi. Voir l'exemple suivant:

importation WX

MonFormulaire classe (wx.Frame):

def __init__(self): 
    wx.Frame.__init__(self, None, wx.ID_ANY, "List Control Tutorial", size=(500,500)) 

    # Add a panel so it looks the correct on all platforms 
    panel = wx.Panel(self, wx.ID_ANY) 
    self.index = 0 

    self.list_ctrl = wx.ListCtrl(panel, size=(-1,100), 
        style=wx.LC_REPORT 
        |wx.BORDER_SUNKEN 
        ) 
    self.list_ctrl.InsertColumn(0, 'Subject') 
    self.list_ctrl.InsertColumn(1, 'Due') 
    self.list_ctrl.InsertColumn(2, 'Location', width=125) 
    self.list_ctrl.Bind(wx.EVT_LEFT_DOWN, self.onLeftClick) 

    btn = wx.Button(panel, label="Add Line") 
    btn.Bind(wx.EVT_BUTTON, self.add_line) 

    sizer = wx.BoxSizer(wx.VERTICAL) 
    sizer.Add(self.list_ctrl, 0, wx.ALL|wx.EXPAND, 5) 
    sizer.Add(btn, 0, wx.ALL|wx.CENTER, 5) 
    panel.SetSizer(sizer) 

def add_line(self, event): 
    line = "Line %s" % self.index 
    self.list_ctrl.InsertStringItem(self.index, line) 
    self.list_ctrl.SetStringItem(self.index, 1, "01/19/2010") 
    self.list_ctrl.SetStringItem(self.index, 2, "USA") 
    self.index += 1 

def onLeftClick(self, event): 
    pos = event.GetPosition() 
    print str(pos) 

J'espère que cela aide.


Mike Driscoll

Blog: http://blog.pythonlibrary.org

+0

Désolé, je ne vois pas où vous imprimez les coordonnées X et Y du clic de souris?Ou toute autre façon de détecter si la souris a été cliquée sur l'image par opposition à n'importe où ailleurs sur l'élément. – Malvineous

+0

Voir la méthode onLeftClick. Obtenez la position de la souris avec "event.GetPosition()" et imprimez-la avec "print str (pos)" –

Questions connexes