Bonjour (ou plutôt bonsoir ^^)
J'ai créé une wx.ListCtrl virtuelle de manière à libérer de la mémoire, et que je souhaite synchroniser avec une base de données sous Elixir (donc sous SQLAlchemy). Le tout fonctionne, c'est-à-dire que les résultats s'affichent proprement dans ma ListCtrl, mais mon problème, c'est que pour seulement 4 résultats, la liste n'est déjà plus fluide (c'est très léger, mais je constate quand même ce léger ralentissement et cela peut être génant pour une liste qui peut contenir quelques milliers de résultats, à terme).
Voici tout d'abord à quoi ressemble ma classe de base de données :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 class Mouvement(Entity): nombre = Field(Float(1)) date = Field(Integer()) #J'utilise un timestamp mais je ne veux pas #utiliser des objets datetime puisque j'utilise # les wx.DateTime fournis avec wxPython description = Field(Unicode()) action = ManyToOne('Action') class Action(Entity): nom = Field(Unicode()) mouvements = OneToMany('Mouvement')
Et voici à quoi ressemble ma liste virtuelle :
Je précise que la liste self.itemid permet de retrouver les mouvements par leur id. On saura ainsi qu'à la ligne <row>, l'ID du mouvement à récupérer sera donnée par self.itemid[row].
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 class HistoriqueMouvement(wx.ListCtrl): def __init__(self, parent, id): wx.ListCtrl.__init__(self, parent, id, size=parent.GetClientSize(), style=wx.LC_REPORT|wx.LC_VIRTUAL|wx.LC_SINGLE_SEL) self.InsertColumn(0, u"Nom de l'action") self.InsertColumn(1, u"Nombre") self.InsertColumn(2, u"Date du mouvement") self.InsertColumn(3, u"Description") self.itemid = [mvmt.id for mvmt in Mouvement.query.all()] self.SetItemCount(len(self.itemid)) def OnGetItemText(self, row, column): id = self.itemid[row] mvmt = Mouvement.query.filter_by(id=id).one() if column==0: itm = mvmt.action.nom elif column==1: itm = mvmt.nombre elif column==2: itm = wx.DateTime().SetTimeT(mvmt.date).FormatDate() elif column==3: itm = mvmt.description return itm
Le tout est peut-être un peu maladroit, mais j'espère que c'est quand même correct. Ce n'est jamais évident d'apprendre en autodidacte sans avoir jamais reçu de cours de programmation
L'utilisation de self.itemid est peut être aussi un peu ambigue, mais je n'ai pas trouvé mieux pour pouvoir établir une correspondance entre les lignes de la ListCtrl et les objets de la BDD.
Y aurait-il un moyen d'optimiser ce fonctionnement de synchronisation entre la ListCtrl et la BDD ?
# -----------------------------------------------------------------------#
J'aurai également d'autres questions S.V.P, si vous avez le temps, merci.
1) Dans quel cas utiliser une ListCtrl virtuelle plutôt qu'une liste réelle ? Par exemple, dans ce cas-là, mon choix d'utiliser une liste virtuelle est-il bon ?
2) Lorsque je fais une requête : Mouvement.query.all(), le programme éxécute un SELECT et me renvoie une liste d'instances. Maintenant, lorsque je récupère l'attribut "nom" d'une instance, le programme éxécute-t-il aussi une requête "SELECT nom" ? Ou est-ce qu'il le récupère simplement auprès de l'instance ?
Merci beaucoup d'avance
Lotendan
Partager