Hello la ML,

J'essaie de jouer un peu avec les listes en WxPython. J'ai vu qu'il existait un objet ListBox, sur lequel je me pose deux questions:

1. Quel moyen le système me fournirait-il pour connaître le nombre d'éléments de cette liste à un instant donné? Je n'ai pas trouvé de manière évidente en tout cas...

2. Les déplacements dans la liste que je crée, ne "bouclent pas". Pour ce que je voulais en faire, ça ne m'arrange pas forcément, parce qu'il s'agit de choisir entre deux éléments, et peu importe que l'un soit en position 1 et l'autre en position 2, c'est sur le contenu que je dois choisir. Existerait-il un paramètre qui régit le "bouclage"?

Pour illustrer un peu la question 1, je suis parti d'un exemple, tiré d'une doc en anglais qui me plaît bien, dont le titre est grosso modo: WXPython ZetCode tutorial... J'ai mis l'exemple en pJ.

J'ai voulu y ajouter la sélection automatique d'un élément selon l'action effectuée; et du coup, pour gérer cette histoire de nombre d'éléments, j'y ai inséré du code, les lignes en question sont repérées par # jf. Est-ce que vraiment j'étais obligé de passer par là pour garder trace du nombre d'éléments, sachant que Jaws est capable, lui, de me l'indiquer?

Merci,
J.-F.




#!/usr/bin/python

# listbox.py

import wx

ID_NEW = 1
ID_RENAME = 2
ID_CLEAR = 3
ID_DELETE = 4


class ListBox(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(350, 220))

        panel = wx.Panel(self, -1)
        hbox = wx.BoxSizer(wx.HORIZONTAL)

        self.listbox = wx.ListBox(panel, -1)
        self.len = 0   # nombre d'elements de la liste
        hbox.Add(self.listbox, 1, wx.EXPAND | wx.ALL, 20)

        btnPanel = wx.Panel(panel, -1)
        vbox = wx.BoxSizer(wx.VERTICAL)
        new = wx.Button(btnPanel, ID_NEW, 'New', size=(90, 30))
        ren = wx.Button(btnPanel, ID_RENAME, 'Rename', size=(90, 30))
        dlt = wx.Button(btnPanel, ID_DELETE, 'Delete', size=(90, 30))
        clr = wx.Button(btnPanel, ID_CLEAR, 'Clear', size=(90, 30))

        self.Bind(wx.EVT_BUTTON, self.NewItem, id=ID_NEW)
        self.Bind(wx.EVT_BUTTON, self.OnRename, id=ID_RENAME)
        self.Bind(wx.EVT_BUTTON, self.OnDelete, id=ID_DELETE)
        self.Bind(wx.EVT_BUTTON, self.OnClear, id=ID_CLEAR)
        self.Bind(wx.EVT_LISTBOX_DCLICK, self.OnRename)

        vbox.Add((-1, 20))
        vbox.Add(new)
        vbox.Add(ren, 0, wx.TOP, 5)
        vbox.Add(dlt, 0, wx.TOP, 5)
        vbox.Add(clr, 0, wx.TOP, 5)

        btnPanel.SetSizer(vbox)
        hbox.Add(btnPanel, 0.6, wx.EXPAND | wx.RIGHT, 20)
        panel.SetSizer(hbox)

        self.Centre()
        self.Show(True)

    def NewItem(self, event):
        text = wx.GetTextFromUser('Enter a new item', 'Insert dialog')
        if text != '':
            self.listbox.Append(text)
            self.len += 1  # jf
            self.listbox.SetFocus()  # jf
            self.listbox.SetSelection(self.len-1)  # jf

    def OnRename(self, event):
        sel = self.listbox.GetSelection()
        text = self.listbox.GetString(sel)
        renamed = wx.GetTextFromUser('Rename item', 'Rename dialog', text)
        if renamed != '':
            self.listbox.Delete(sel)
            self.listbox.Insert(renamed, sel)


    def OnDelete(self, event):
        sel = self.listbox.GetSelection()
        if sel != -1:
            self.listbox.Delete(sel)
            if sel != -1:  #jf
                self.listbox.SetSelection(sel)  # jf
            self.len -= 1  # jf
        self.listbox.SetFocus()  # jf

    def OnClear(self, event):
        self.listbox.Clear()
        self.listbox.SetFocus()  # jf
        self.len = 0  # jf



app = wx.App()
ListBox(None, -1, 'ListBox')
app.MainLoop()

self.listbox = wx.ListBox(panel, -1)
hbox.Add(self.listbox, 1, wx.EXPAND | wx.ALL, 20)

Répondre à