#1 Mon 14 April 2025 14:15
- Marcopololo
- Participant actif
- Lieu: Etival Clairefontaine
- Date d'inscription: 23 Nov 2021
- Messages: 97
QGIS: Fonction for range
Bonjour,
Je souhaite dans cette fonction, insérer dans ma liste ":" et "\n" tous les deux champs mais il y a un truc qui ne marche pas dans ma fonction. i s'incrémente bien mais n'est pas envoyé dans insert suf le premier. J'en déduis que ma boucle s'arrête.
Code:
a=['bonjour','Hello','Au revoir','Bye','Aujourd_hui','demain'] lg=len(a) print(lg) for i in range(1,lg,2): a.insert(i,":") a.insert(i+1,"\n") print(i) print(a) print("".join(list(map(str,a))))
Merci de votre aide
Marcopololo
Dernière modification par Marcopololo (Mon 14 April 2025 14:16)
Hors ligne
#2 Mon 14 April 2025 14:54
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 4062
Re: QGIS: Fonction for range
Bonjour,
Lorsque vous insérez ":" dans votre liste, la liste s'agrandit les index sont décalés d'autant, et donc le "\n" est aussi placé plus tôt que prévu. La prochaine itération se fait ensuite sur la position prise par le i, et rebelote...
Je vous propose cette approche où on fait le taf, à reculons. Point de risque de bousculer les index.
Code:
a=['bonjour','Hello','Au revoir','Bye','Aujourd_hui','demain'] lg=len(a) print(lg) for i in range(lg,0,-2): print('le num i est ', i) a.insert(i-1,":") a.insert(i+1,"\n") print(i) print('a est ', a) print("".join(list(map(str,a))))
Par contre, et même si vous en avez besoin pour un script dans QGIS, je ne vois aucun rapport avec QGIS sur ce sujet. On est dans du Python, là. Pensez donc à déposer vos sujets dans les forums les plus adaptés.
Hors ligne
#3 Mon 14 April 2025 15:20
- Marcopololo
- Participant actif
- Lieu: Etival Clairefontaine
- Date d'inscription: 23 Nov 2021
- Messages: 97
Re: QGIS: Fonction for range
Merci beaucoup Santana, en plus j'avais lu cet aspect de commencer à reculons pour éviter ce problème. Mais bon, un débutant reste un débutant tant qu'il n'a pas été confronté au problème.
Hors ligne
#4 Mon 14 April 2025 17:53
- Marcopololo
- Participant actif
- Lieu: Etival Clairefontaine
- Date d'inscription: 23 Nov 2021
- Messages: 97
Re: QGIS: Fonction for range
J'ai intégré ce code dans mon plugin mais je dois encore faire une erreur de débutant car le code ne s'arrête sur la partie insert. Si j'enlève cette partie il fonctionne mais sans le rajout des champs à ma liste.
Un
Code:
print(i)
à la place des insert affiche les bonnes valeurs. Peut être l'attribut fields ?
Code:
def build_travaux_dates(e): # fields = fields.strftime("%d/%m/%Y") fields = [ 'parcelles_Travaux_Date1','parcelles_Travaux_Travaux1', 'parcelles_Travaux_Date2','parcelles_Travaux_Travaux2', 'parcelles_Travaux_Date3','parcelles_Travaux_Travaux3', 'parcelles_Travaux_Date4','parcelles_Travaux_Travaux4', 'parcelles_Travaux_Date5','parcelles_Travaux_Travaux5', 'parcelles_Travaux_Date6','parcelles_Travaux_Travaux6' ] lg = len(fields) print(lg) for i in range(lg, 0, -2): fields.insert(i - 1, ":") fields.insert(i + 1, "\n") to_str = "".join([e[field] for field in fields if e[field]]) #to_str = "".join(list(map(str, fields))) if not to_str: return 'Aucun travaux effectués ici...' return to_str #print("".join(list(map(str, fields)))) self.dlg.travauxListe.setText(build_travaux_dates(e))
Voici l'erreur :
to_str = "".join([e[field] for field in fields if e[field]])
~^^^^^^^
KeyError: ':'
Je soupçonne e de me poser un problème. En effet le champ rajouter ":" n'existe pas dans ma table d'attributs et le problème est le même pour l'autre insert. e vient de display_point qui récupère les valeurs de ma table au point cliqué.
Dernière modification par Marcopololo (Mon 14 April 2025 18:00)
Hors ligne
#5 Mon 14 April 2025 18:17
- Marcopololo
- Participant actif
- Lieu: Etival Clairefontaine
- Date d'inscription: 23 Nov 2021
- Messages: 97
Re: QGIS: Fonction for range
J'avance, comme cela c'est mieux, mais au lieu de m'afficher les données de ma table d'attribut j'ai les éléments de la table de mon code
Code:
def build_travaux_dates(e): # fields = fields.strftime("%d/%m/%Y") fields = [ 'parcelles_Travaux_Date1','parcelles_Travaux_Travaux1', 'parcelles_Travaux_Date2','parcelles_Travaux_Travaux2', 'parcelles_Travaux_Date3','parcelles_Travaux_Travaux3', 'parcelles_Travaux_Date4','parcelles_Travaux_Travaux4', 'parcelles_Travaux_Date5','parcelles_Travaux_Travaux5', 'parcelles_Travaux_Date6','parcelles_Travaux_Travaux6' ] lg = len(fields) print(lg) for i in range(lg, 0, -2): print(i) fields.insert(i - 1, ' : ') fields.insert(i + 1, "\n") to_str = "".join(list(map(str, fields))) print(to_str) # to_str = "".join([e[field] for field in fields if e[field]]) #to_str = "".join(list(map(str, fields))) if not to_str: return 'Aucun travaux effectués ici...' return to_str print("".join(list(map(str, fields)))) self.dlg.travauxListe.setText(build_travaux_dates(e))
Hors ligne
#6 Mon 14 April 2025 19:22
- Marcopololo
- Participant actif
- Lieu: Etival Clairefontaine
- Date d'inscription: 23 Nov 2021
- Messages: 97
Re: QGIS: Fonction for range
Je pense avoir compris le fond de mon problème.
e correspond aux données de ma table attributaire. Et en voulant y ajouter des données que se soit ":" ou "\n" je pense que ce n'est pas possible.
alors ma question est la suivante.
Si je transforme ma table en liste je récupère donc les champs correspondant et qu'ensuite j'en fais une copie. a cette liste j'ajoute les éléments ":" et "\n" puis je la transforme à nouveau en table pour pouvoir l'utiliser, cela serait il fonctionnel.
Je vais testé mais si quelqu'un à une autre idée je suis preneur.
Merci d'avance
Hors ligne
#7 Mon 14 April 2025 23:27
- Marcopololo
- Participant actif
- Lieu: Etival Clairefontaine
- Date d'inscription: 23 Nov 2021
- Messages: 97
Re: QGIS: Fonction for range
Voilà j'y suis presque après de longues heures de bataille. Il me reste encore à injecter ma nouvelle table dans la boite de dialogue et régler les soucis d'insert en trop :
Code:
def build_travaux_dates(e): # fields = fields.strftime("%d/%m/%Y") fields = [ 'parcelles_Travaux_Date1', 'parcelles_Travaux_Travaux1', 'parcelles_Travaux_Date2', 'parcelles_Travaux_Travaux2', 'parcelles_Travaux_Date3', 'parcelles_Travaux_Travaux3', 'parcelles_Travaux_Date4', 'parcelles_Travaux_Travaux4', 'parcelles_Travaux_Date5', 'parcelles_Travaux_Travaux5', 'parcelles_Travaux_Date6', 'parcelles_Travaux_Travaux6' ] to_str = " : ".join([e[field] for field in fields if e[field]]) print("str:",to_str) if not to_str: return 'Aucun travaux effectués ici...' lg=len(fields) print(lg) to_tbl = to_str.split(" : ") #print(to_tbl) for i in range(lg,0,-2): to_tbl.insert(i-1," : ") to_tbl.insert(i+1,"\n") print ("to_tbl:",to_tbl) to_str2 = "".join(to_tbl) print("to_str2:",to_str2) #print(" : ".join([e[field] for field in fields if e[field]])) return to_str self.dlg.travauxListe.setText(build_travaux_dates(e))
Dernière modification par Marcopololo (Mon 14 April 2025 23:30)
Hors ligne
#8 Tue 15 April 2025 12:33
- Marcopololo
- Participant actif
- Lieu: Etival Clairefontaine
- Date d'inscription: 23 Nov 2021
- Messages: 97
Re: QGIS: Fonction for range
Encore un autre petit soucis de compréhension, je n'arrive pas à afficher dans ma boite de dialogue la valeur se to_str2, puisqu'elle n'est pas dans le même niveau. Comment fait on pour la récupérer et que je puisse l'utiliser dans une commande de type self.dlg.travauxListe ?
Merci de votre aide
Marcopololo
Hors ligne
#9 Wed 16 April 2025 13:40
- Marcopololo
- Participant actif
- Lieu: Etival Clairefontaine
- Date d'inscription: 23 Nov 2021
- Messages: 97
Re: QGIS: Fonction for range
Après de nombreuses recherches et de l'aide, voici enfin un code qui fonctionne
Code:
def build_travaux_dates(e): # fields = fields.strftime("%d/%m/%Y") fields = [ 'parcelles_Travaux_Date1', 'parcelles_Travaux_Travaux1', 'parcelles_Travaux_Date2', 'parcelles_Travaux_Travaux2', 'parcelles_Travaux_Date3', 'parcelles_Travaux_Travaux3', 'parcelles_Travaux_Date4', 'parcelles_Travaux_Travaux4', 'parcelles_Travaux_Date5', 'parcelles_Travaux_Travaux5', 'parcelles_Travaux_Date6', 'parcelles_Travaux_Travaux6' ] items = [e[field] for field in fields if e[field]] str2 = '\n'.join(f'{a} : {b}' for a, b in list(batched(items, 2))) print("str:",str2) if not str2: return 'Aucun travaux effectués ici...' return str2 self.dlg.travauxListe.setText(build_travaux_dates(e))
Hors ligne