Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème d'init de variables

20 réponses
Avatar
NicolasP
Bonjour,

Dans un programme avec interface graphique wxPython, j'ai un objet graphique de type liste virtuelle qui possède plusieurs colonnes.
Ces colonnes sont initialisées par mon code comme ceci.

self.columns = [u"Nom",
u"Mouvement",
u"Affectation",
u"Montant",
u"Observation",
u"Date début",
u"Date fin",
u"Périodicité"]
index = 0
for c in self.columns :
self.InsertColumn (index, c)
index += 1

En changeant l'ordre des éléments dans self.columns, je peux changer l'ordre d'affichage des colonnes dans la liste.

Mon problème est que partout ailleurs dans le code, c'est le numéro de colonne qui est utilisé.
Par exemple, wxPython envoie un évènement à mon application pour demander le contenu de la colonne x de la ligne y.
Je fais alors :
if x == self.columns.index(u"Nom") :
...
elif x == self.columns.index(u"Mouvement") :
...
etc

Ca marche mais ça ne me plait pas. Et bonjour les bugs quand je changerais un nom de colonne un jour.
Et je ne peux pas non plus changer l'ordre des colonnes dynamiquement pendant l'exécution.

J'aimerais remplir des variables contenant le numéro de colonne automatiquement à l'init.
J'ai pensé à un truc du genre :

self.col_nom = 0
self.col_mouvement = 0
self.col_affectation = 0
self.col_montant = 0
self.col_observation = 0
self.col_date_debut = 0
self.col_date_fin = 0
self.col_periode = 0
self.columns = ((u"Nom" , self.col_nom),
(u"Mouvement" , self.col_mouvement),
(u"Affectation" , self.col_affectation),
(u"Montant" , self.col_montant),
(u"Observation" , self.col_observation),
(u"Date début" , self.col_date_debut),
(u"Date fin" , self.col_date_fin),
(u"Périodicité" , self.col_periode))
index = 0
for k,v in self.columns :
self.InsertColumn (index, k)
# Je fais quoi avec v ?
index += 1

Mais après je fais comment pour affecter une valeur aux variables self.col_xxx ?
Il n'y a pas de pointeurs en Python mais c'est bien un truc du genre qu'il me faudrait ici.

Je vois bien une solution avec exec mais je trouve ça moche:

self.columns = ((u"Nom" , "self.col_nom"),
(u"Mouvement" , "self.col_mouvement"),
(u"Affectation" , "self.col_affectation"),
(u"Montant" , "self.col_montant"),
(u"Observation" , "self.col_observation"),
(u"Date début" , "self.col_date_debut"),
(u"Date fin" , "self.col_date_fin"),
(u"Périodicité" , "self.col_periode"))
for k,v in self.columns :
self.InsertColumn (index, k)
exec(v+"=%d"%index)
index += 1

Quelqu'un aurait-il une belle solution à me proposer ?

Nicolas

10 réponses

1 2
Avatar
Pierre Maurette
Pierre Quentel, le 14/10/2010 a écrit :

[...]

L'initialisation devient :

for index,c in enumerate(self.columns) :
self.InsertColumn (index, c[0])
index += 1



index += 1 ?

--
Pierre Maurette
Avatar
NicolasP
Le 14/10/2010 10:14, Pierre Maurette a écrit :
Pierre Quentel, le 14/10/2010 a écrit :

[...]

L'initialisation devient :

for index,c in enumerate(self.columns) :
self.InsertColumn (index, c[0])
index += 1



index += 1 ?



Problème de copier-coller.
Avatar
Pierre Maurette
, le 13/10/2010 a écrit :

[...]

Ou bien plus simplement utiliser un dict:

self.columns_index = {}
self.columns = (u"Nom",
u"Mouvement",
u"Affectation",
u"Montant",
u"Observation",
u"Date début",
u"Date fin",
u"Périodicité")

for index, name in self.columns:



for index, name in enumerate(self.columns):

self.InsertColumn(index, name)
self.columns_index[index] = name



On peut peut-être faire:
self.columns_index = dict(zip(range(len(self.columns)), self.columns))

--
Pierre Maurette
Avatar
Pierre Quentel
On 14 oct, 10:24, NicolasP wrote:
Le 14/10/2010 10:14, Pierre Maurette a écrit :> Pierre Quentel, le 14/1 0/2010 a écrit :

> [...]

>> L'initialisation devient :

>> for index,c in enumerate(self.columns) :
>> self.InsertColumn (index, c[0])
>> index += 1

> index += 1 ?

Problème de copier-coller.



je confirme...
Avatar
NicolasP
Le 14/10/2010 09:54, NicolasP a écrit :
Le 14/10/2010 09:39, Pierre Quentel a écrit :
On 13 oct, 10:05, NicolasP wrote:
Bonjour,

Dans un programme avec interface graphique wxPython, j'ai un objet graphique de type liste virtuelle qui possède plusieurs colonnes.
Ces colonnes sont initialisées par mon code comme ceci.

self.columns = [u"Nom",
u"Mouvement",
u"Affectation",
u"Montant",
u"Observation",
u"Date début",
u"Date fin",
u"Périodicité"]
index = 0
for c in self.columns :
self.InsertColumn (index, c)
index += 1

En changeant l'ordre des éléments dans self.columns, je peux changer l'ordre d'affichage des colonnes dans la liste.

Mon problème est que partout ailleurs dans le code, c'est le numéro de colonne qui est utilisé.
Par exemple, wxPython envoie un évènement à mon application pour demander le contenu de la colonne x de la ligne y.
Je fais alors :
if x == self.columns.index(u"Nom") :
...
elif x == self.columns.index(u"Mouvement") :
...
etc

Ca marche mais ça ne me plait pas. Et bonjour les bugs quand je changerais un nom de colonne un jour.
Et je ne peux pas non plus changer l'ordre des colonnes dynamiquement pendant l'exécution.

J'aimerais remplir des variables contenant le numéro de colonne automatiquement à l'init.
J'ai pensé à un truc du genre :

self.col_nom = 0
self.col_mouvement = 0
self.col_affectation = 0
self.col_montant = 0
self.col_observation = 0
self.col_date_debut = 0
self.col_date_fin = 0
self.col_periode = 0
self.columns = ((u"Nom" , self.col_nom),
(u"Mouvement" , self.col_mouvement),
(u"Affectation" , self.col_affectation),
(u"Montant" , self.col_montant),
(u"Observation" , self.col_observation),
(u"Date début" , self.col_date_debut),
(u"Date fin" , self.col_date_fin),
(u"Périodicité" , self.col_periode))
index = 0
for k,v in self.columns :
self.InsertColumn (index, k)
# Je fais quoi avec v ?
index += 1

Mais après je fais comment pour affecter une valeur aux variables self.col_xxx ?
Il n'y a pas de pointeurs en Python mais c'est bien un truc du genre qu'il me faudrait ici.

Je vois bien une solution avec exec mais je trouve ça moche:

self.columns = ((u"Nom" , "self.col_nom"),
(u"Mouvement" , "self.col_mouvement"),
(u"Affectation" , "self.col_affectation"),
(u"Montant" , "self.col_montant"),
(u"Observation" , "self.col_observation"),
(u"Date début" , "self.col_date_debut"),
(u"Date fin" , "self.col_date_fin"),
(u"Périodicité" , "self.col_periode"))
for k,v in self.columns :
self.InsertColumn (index, k)
exec(v+"=%d"%index)
index += 1

Quelqu'un aurait-il une belle solution à me proposer ?

Nicolas



Bonjour,

Une suggestion : tu peux compléter la liste des colonnes en associant
à chaque nom une méthode qui va gérer l'événement correspondant :

self.columns = [(u"Nom",self.gere_nom),
(u"Mouvement",self.gere_mvt),
etc...
]

L'initialisation devient :

for index,c in enumerate(self.columns) :
self.InsertColumn (index, c[0])
index += 1

Quand tu reçois l'événement référencé par le numéro de colonne, tu
récupères le gestionnaire d'événement :

gestionnaire = self.columns[x][1]

et après il ne reste plus qu'à l'exécuter, avec les éventuels
paramètres passés par wxPython, genre :

gestionnaire(y)

- Pierre



Bonjour Pierre,

Ton idée me plait.
J'essaie ça ce soir.



J'ai poussé l'idée plus loin en créant des objets ColumnXXX() possédant des méthodes GetName(), GetText()...
self.columns est maintenant une liste simple d'objets ColumXXX.

Merci pour l'idée.

Nicolas

Nicolas

Avatar
bruno.desthuilliers
On 14 oct, 12:42, Pierre Maurette wrote:
, le 13/10/2010 a écrit :

[...]

> Ou bien plus simplement utiliser un dict:

> self.columns_index = {}
> self.columns = (u"Nom",
>                  u"Mouvement",
>                  u"Affectation",
>                  u"Montant",
>                  u"Observation",
>                  u"Date début",
>                  u"Date fin",
>                  u"Périodicité")

> for index, name in self.columns:

for index, name in enumerate(self.columns):




oops :(

Merci pour la correction.
Avatar
bruno.desthuilliers
On 14 oct, 09:48, NicolasP wrote:
Le 13/10/2010 20:01, a écrit :


(snip)
> Ceci étant, ça continue à me paraitre bancal comme truc, et comme
> toutes les solutions bancales, la solution est généralement dans 1/
> une meilleure compréhension de l'outil (ici wxWidgets) et 2/ la
> structure de données appropriée.

C'est justement ce que je cherche. Un truc pas bancal.



Yeps, mais ça demande plus de contexte que ce que tu a fourni. Mais
bon, il semble que tu ais solutionné ton problème, donc...
Avatar
bruno.desthuilliers
On 15 oct, 08:44, NicolasP wrote:
(snip)

J'ai poussé l'idée plus loin en créant des objets ColumnXXX() poss édant des méthodes GetName(), GetText()...



Totalement HS, mais la convention de nommage en python serait
"get_name" et "get_text" - mais bon, je ne sais plus si wxWidget
respecte cette convention, et puis l'essentiel est que ton nommage
soit cohérent pour ce projet.
Avatar
NicolasP
Le 15/10/2010 15:02, a écrit :
On 15 oct, 08:44, NicolasP wrote:
(snip)

J'ai poussé l'idée plus loin en créant des objets ColumnXXX() possédant des méthodes GetName(), GetText()...



Totalement HS, mais la convention de nommage en python serait
"get_name" et "get_text" - mais bon, je ne sais plus si wxWidget
respecte cette convention, et puis l'essentiel est que ton nommage
soit cohérent pour ce projet.



wxPython ne respecte pas la convention de nommage de Python mais celle de wxWidget qui est une librairie C++. J'ai fait le choix de respecter celle de wxPython.
Avatar
NicolasP
Le 15/10/2010 15:00, a écrit :
On 14 oct, 09:48, NicolasP wrote:
Le 13/10/2010 20:01, a écrit :


(snip)
Ceci étant, ça continue à me paraitre bancal comme truc, et comme
toutes les solutions bancales, la solution est généralement dans 1/
une meilleure compréhension de l'outil (ici wxWidgets) et 2/ la
structure de données appropriée.



C'est justement ce que je cherche. Un truc pas bancal.



Yeps, mais ça demande plus de contexte que ce que tu a fourni. Mais
bon, il semble que tu ais solutionné ton problème, donc...


C'est jamais facile de décrire un problème, même simple.
Quand on a le nez dans le guidon, on oublie toujours des infos évidentes pour celui qui décrit le problème mais pas du tout pour le lecteur.
Ceci-dit, mon exposé ne devait pas être si mauvais que ça car visiblement certains l'ont compris et proposé des solutions.
1 2