OVH Cloud OVH Cloud

wxpython + wx.ListCtrl

6 réponses
Avatar
sir_highleaf
Bonjour =E0 tous,

J'essaye actuellement la biblioth=E8que WX.

J'ai un petit probl=E8me de manipulation des donn=E9es dans les listes.

J'ai le code suivant pour la liste :

self.liste_controle =3D
wx.ListCtrl(id=3DwxID_FENETRE_PRINCIPALELISTE_CONTROLE,
name=3Du'liste_controle', parent=3Dself, pos=3Dwx.Point(16,
192),
size=3Dwx.Size(776, 464),style=3Dwx.LC_REPORT)
self.liste_controle.SetAutoLayout(False)
self.liste_controle.SetLabel(u'Enregistrements')
self._init_coll_liste_controle_Columns(self.liste_controle)

Je remplis la liste :

self.liste_controle.DeleteAllItems()
cu =3D con.cursor()
req =3D """SELECT * FROM liens ORDER BY nom ASC;""" cu.execute(req)
res =3D cu.fetchall()

i =3D 0
for a,b,c,d in res:
self.liste_controle.InsertStringItem(i,str(a))
self.liste_controle.SetStringItem(i,1,str(b))
self.liste_controle.SetStringItem(i,2,str(c))
self.liste_controle.SetStringItem(i,3,str(d))
i=3Di+1

J'y ajoute un =E9v=E9nement :

self.liste_controle.Bind(wx.EVT_LIST_ITEM_SELECTED,
self.OnListe_controleListItemSelected,
id=3DwxID_FENETRE_PRINCIPALELISTE_CONTROLE)

Dans ma fonction OnListe_controleListItemSelected()
j'aimerais pouvoir acc=E9der aux =E9l=E9ments qui ont =E9t=E9 mis en place
dans la liste.
Je consulte la doc mais quelque chose m'=E9chappe...je n'arrive qu'=E0
r=E9cup=E9rer
la position d'un item ainsi que son texte mais je n'arrive pas =E0
acc=E9der aux donn=E9es des autres colonnes.

J'arrive =E0 r=E9cup=E9rer pour l'instant :

event.m_itemIndex pour la position et
self.liste_controle.GetItemText(self.currentItem) pour le texte.

Comment acc=E9der facilement aux donn=E9es d'une ligne enti=E8re par
exemple ? =E7a m'=E9viterait de refaire une requ=EAte sql en fonction de
la position dans l'index de la liste.

Peut-=EAtre que tout simplement ce contr=F4le ne correspond pas =E0 ce que
je veux faire. En fait je souhaite une liste a plusieurs colonnes,
quand on selectionne un =E9lement, les donn=E9es de cet =E9l=E9ment sont
r=E9=E9dit=E9es dans de simples champs texte.

Pardonnez moi la tartine et je vous remercie par avance pour l'aide que
vous pourriez m'apporter. Les remarques sur le code ou la conception
sont les bienvenus.

Cordialement,

Julien

6 réponses

Avatar
bruno modulix
sir_highleaf wrote:
Bonjour à tous,


Bonjour Julien

J'essaye actuellement la bibliothèque WX.

J'ai un petit problème de manipulation des données dans les listes.

(snip)


Dans ma fonction OnListe_controleListItemSelected()
j'aimerais pouvoir accéder aux éléments qui ont été mis en place
dans la liste.
Je consulte la doc mais quelque chose m'échappe...je n'arrive qu'à
récupérer
la position d'un item ainsi que son texte mais je n'arrive pas à
accéder aux données des autres colonnes.

(snip)


Peut-être que tout simplement ce contrôle ne correspond pas à ce que
je veux faire. En fait je souhaite une liste a plusieurs colonnes,


Alors effectivement, ce n'est pas le bon widget. Regarde du côté des grids:

http://www.wxwidgets.org/manuals/2.6.1/wx_gridoverview.html

HTH
--
bruno desthuilliers
ruby -e "print ''.split('@').collect{|p|
p.split('.').collect{|w| w.reverse}.join('.')}.join('@')"
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

Avatar
sir_highleaf
Merci pour votre aide, je m'en vais essayer ce contrôle tout de suite.

Julien
Avatar
Amaury
Bonjour à tous,

J'essaye actuellement la bibliothèque WX.

J'ai un petit problème de manipulation des données dans les listes.

J'ai le code suivant pour la liste :

self.liste_controle > wx.ListCtrl(id=wxID_FENETRE_PRINCIPALELISTE_CONTROLE,
name=u'liste_controle', parent=self, pos=wx.Point(16,
192),
size=wx.Size(776, 464),style=wx.LC_REPORT)
...


Dans ma fonction OnListe_controleListItemSelected()
j'aimerais pouvoir accéder aux éléments qui ont été mis en place
dans la liste.
Je consulte la doc mais quelque chose m'échappe...je n'arrive qu'à
récupérer
la position d'un item ainsi que son texte mais je n'arrive pas à
accéder aux données des autres colonnes.

J'arrive à récupérer pour l'instant :

event.m_itemIndex pour la position et
self.liste_controle.GetItemText(self.currentItem) pour le texte.

Comment accéder facilement aux données d'une ligne entière par
exemple ? ça m'éviterait de refaire une requête sql en fonction de
la position dans l'index de la liste.


En regardant la doc:

http://www.wxwidgets.org/manuals/2.6.1/wx_wxlistctrl.html#wxlistctrlgetitem
"La version wxPython prend en paramètres le numéro de la ligne, le
numéro de colonne (optionnel), et renvoie un objet wx.ListItem"
(traduction libre...)

J'essaierais donc ceci:
info = self.liste_controle.GetItem(self.currentItem,colonne)
valeur = info.m_text


Peut-être que tout simplement ce contrôle ne correspond pas à ce que
je veux faire. En fait je souhaite une liste a plusieurs colonnes,
quand on selectionne un élement, les données de cet élément sont
rééditées dans de simples champs texte.



Si tu veux pouvoir modifier les données, regarde dans la démo le
controle "Editable_ListCtrl" (ou qqchose comme ça), qui explique comment
faire.

--
Amaury

Avatar
Amaury
Bonjour,


Peut-être que tout simplement ce contrôle ne correspond pas à ce que
je veux faire. En fait je souhaite une liste a plusieurs colonnes,



Alors effectivement, ce n'est pas le bon widget. Regarde du côté des grids:

http://www.wxwidgets.org/manuals/2.6.1/wx_gridoverview.html



En fait, dans mon application j'utilisais aussi un "grid", pour
bénéficier de ses fonctions d'édition, mais je me suis aperçu que dès
qu'on veut un contrôle très fin, ce widget devient vite un cauchemar.

Maintenant, je recode tout avec un wx.ListControl, que je rends
"éditable" comme dans la démo Editable_ListCtrl...
Et c'est beaucoup plus confortable.

--
Amaury


Avatar
sir_highleaf
Bonjour,

En fait j'ai réussi à m'en sortir avec le contrôle Grid grâce aux
méthodes : SetCellValue, GetCellValue, GetGridCursorRow et
GetGridCursorCol.

Disons qu'en ayant essayé les deux, les ListCtrl présentent mieux
graphiquement pour le type de données que je gère. Je vais retenter
avec une ListCtrl dès que j'ai un peu de temps.

Merci à tous pour vos avis et précisions.

Cordialement,

Julien
Avatar
Pascal Chenevas-Paule
sir_highleaf wrote:
Bonjour à tous,

J'essaye actuellement la bibliothèque WX.

J'ai un petit problème de manipulation des données dans les listes.

J'ai le code suivant pour la liste :

self.liste_controle > wx.ListCtrl(id=wxID_FENETRE_PRINCIPALELISTE_CONTROLE,
name=u'liste_controle', parent=self, pos=wx.Point(16,
192),
size=wx.Size(776, 464),style=wx.LC_REPORT)
self.liste_controle.SetAutoLayout(False)
self.liste_controle.SetLabel(u'Enregistrements')
self._init_coll_liste_controle_Columns(self.liste_controle)

Je remplis la liste :

self.liste_controle.DeleteAllItems()
cu = con.cursor()
req = """SELECT * FROM liens ORDER BY nom ASC;""" cu.execute(req)
res = cu.fetchall()

i = 0
for a,b,c,d in res:
self.liste_controle.InsertStringItem(i,str(a))
self.liste_controle.SetStringItem(i,1,str(b))
self.liste_controle.SetStringItem(i,2,str(c))
self.liste_controle.SetStringItem(i,3,str(d))
i=i+1

J'y ajoute un événement :

self.liste_controle.Bind(wx.EVT_LIST_ITEM_SELECTED,
self.OnListe_controleListItemSelected,
id=wxID_FENETRE_PRINCIPALELISTE_CONTROLE)

Dans ma fonction OnListe_controleListItemSelected()
j'aimerais pouvoir accéder aux éléments qui ont été mis en place
dans la liste.
Je consulte la doc mais quelque chose m'échappe...je n'arrive qu'à
récupérer
la position d'un item ainsi que son texte mais je n'arrive pas à
accéder aux données des autres colonnes.

J'arrive à récupérer pour l'instant :

event.m_itemIndex pour la position et
self.liste_controle.GetItemText(self.currentItem) pour le texte.

Comment accéder facilement aux données d'une ligne entière par
exemple ? ça m'éviterait de refaire une requête sql en fonction de
la position dans l'index de la liste.

Peut-être que tout simplement ce contrôle ne correspond pas à ce que
je veux faire. En fait je souhaite une liste a plusieurs colonnes,
quand on selectionne un élement, les données de cet élément sont
rééditées dans de simples champs texte.

Pardonnez moi la tartine et je vous remercie par avance pour l'aide que
vous pourriez m'apporter. Les remarques sur le code ou la conception
sont les bienvenus.

Cordialement,

Julien

Salut ,


petit hors sujet,

utilises tu ou as tu déjà utilisé wxGlade ?

merci,

Pascal