IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Variable adaptative indentation


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    septembre 2022
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 20
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : septembre 2022
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Variable adaptative indentation
    Bonjour à tous,

    Je me tourne vers vous car j'ai une requête un petit peu complexe et je ne suis pas sûr que cela soit possible en Python.

    Pour faire simple, je suis en train de créer une application qui va créer plusieurs boutons en tkinter à l'aide d'un while et je voudrais donc que le while puisse créer plusieurs variables avec différents noms (le nombre de bouton est variable d'où le besoin d'utiliser un while)

    Voici un extrait de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    i = 1
    day = 1
    num_row = 0
    num_column = 0
    while i <= month[nb_month][0]:
        date1 = Button(root, text = day, font='Arial 25', bg = "white")
        date1.grid(row = num_row, column = num_column)
    
        if num_column == 9:
            num_column = 0
            num_row += 1
    
        i += 1
    Ce que je voudrais donc faire est que mon code modifie automatiquement le nom de la variable mis en gras à chaque indentation (par exemple : date1, date2, date3, ...)

    J'espère avoir été clair je peux essayer de donner plus de détails si ma demande n'est pas assez précise.

    Merci d'avance
    Bonne soirée

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    juillet 2006
    Messages
    3 424
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Alimentation

    Informations forums :
    Inscription : juillet 2006
    Messages : 3 424
    Points : 6 249
    Points
    6 249
    Par défaut
    Bonjour,

    Ce n'est clairement pas une bonne pratique ! On ne génère pas dynamiquement des variables avec des noms distincts

    Une des solutions les plus simples pour nommer ses boutons est d'utiliser les dictionnaires.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    12 118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 12 118
    Points : 29 565
    Points
    29 565
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par ImValll Voir le message
    J'espère avoir été clair je peux essayer de donner plus de détails si ma demande n'est pas assez précise.
    Très clair, demande parfaitement précise, mais totalement inutile.
    En programmation, quand on veut stocker n éléments identiques, on utilise un tableau. Tu veux stocker 5 prix: un tableau de prix. Tu veux stocker 160 fruits: un tableau de fruits. Et tu veux stocker month[nb_month][0] boutons: un tableau de boutons.
    En plus c'est tout bénef. Au lieu de devoir ensuite traiter "bouton1" puis 3 lignes plus bas traiter "bouton2" de la même façon (code dupliqué), tu écris une boucle for b in boutons et tu traites simplement "b" (code de traitement écrit une fois).
    Un exemple: générer et afficher 5 prix entre 10 et 100€

    Ta solution
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # Remplissage
    prix1=random.randint(10, 100)
    prix2=random.randint(10, 100)
    prix3=random.randint(10, 100)
    prix4=random.randint(10, 100)
    prix5=random.randint(10, 100)
     
    # Affichage
    print(prix1)
    print(prix2)
    print(prix3)
    print(prix4)
    print(prix5)
    Et le jour où tu passes à 500 (remarque tu dois avoir conscience du problème puisque c'est justement le but de ta question "comment automatiser cet indice prixN")

    Donc pour ça, la solution habituelle: passer réellement par un truc offrant déjà une notion d'indice
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # Remplissage
    prix=list()
    for i in range(5):
    	prix.append(random.randint(10, 100))
     
    # Eventuellement un programmeur Python habitué mettra à la place une liste en intension...
    prix=[random.randint(10, 100) for i in range(5)]
     
    # Affichage
    for p in prix:
    	print(p)
    Et si je veux passer à 500 no soucy!!!

    Les langages de programmation (dont Python) t'offrent des outils tout fait pour ces problèmes déjà connus ; plutôt que de chercher à réinventer l'eau tiède au travers de solutions toutes plus bancales les unes que les autres, apprends à les utiliser...

    Citation Envoyé par ImValll Voir le message
    while i <= month[nb_month][0]
    for i in range(month[nb_month][0])
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    septembre 2022
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 20
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : septembre 2022
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Rebonsoir,

    Merci pour vos retours, vos propositions de solutions sont intéressantes et j'y avait déjà pensé avant cependant avec celle-ci je n'ai pas l'impression que je pourrai ensuite réutiliser mes boutons.

    Mon application est constituée de plusieurs "pages" avec dans chacune d'entre elles des boutons avec des fonctions qui leur sont attribuées bien distinctes.
    A chaque fois que l'utilisateur décide de passer d'une page à une autre mon programme va modifier ou supprimer chaque boutons (je n'ai pas encore décidé quelle méthode serai la plus optimisé dans mon cas) afin de les remplacer par des autres avec des autres fonctions.

    C'est pourquoi je m'étais tourné vers une idée de 1 bouton = 1 variable pour pouvoir tous les différencier mais je n'avais pas envie de devoir tous taper à la main d'où mon idée d'automatisation.

    Mais je ne dit pas que vos solutions n'iraient pas mais s'il y a un moyen de les différencier pour les réutiliser facilement ensuite au cas par cas je n'ai pas compris comment faire.

    Je ne pense pas que ce que j'ai en tête soit réalisable mais j'attend quand même vos réponses au cas où.

    Bonne soirée

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    12 118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 12 118
    Points : 29 565
    Points
    29 565
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ImValll Voir le message
    C'est pourquoi je m'étais tourné vers une idée de 1 bouton = 1 variable pour pouvoir tous les différencier mais je n'avais pas envie de devoir tous taper à la main d'où mon idée d'automatisation.
    Le "un truc=une variable" marche parfaitement avec les tableaux (et j'ai écrit volontairement "truc" pour être le plus généraliste possible donc ça peut parfaitement s'appliquer aux boutons).
    Dans mon exemple sur les aléas, "prix[1]" est une variable bien précise et totalement différente de "prix[4]". Dit autrement, il n'y a aucune différence fondamentale entre des variables "prix_1", "prix_2", "prix_3" ou des variables "prix[1]", "prix[2]", "prix[3]". Mais la seconde écriture est bien plus souple car elle permet la programmation généraliste "j'applique un traitement sur prix[i] avec i variant de 0 à n".

    Regarde cet exemple issu du programme Filezilla. Il affiche, pour chaque fichier à transférer, des éléments graphiques comme des cases à cocher ou des barres de progression. Le codeur n'a certainement pas utilisé des notations comme "case_a_cocher_1", "case_a_cocher_2", "case_a_cocher_3" mais est obligatoirement passé par un tableau de cases. Et pareil pour les barres(*). Et je dis "obligatoirement" en pesant bien mes mots. Il ne peut pas être passé par ta façon de faire.
    Nom : Filezilla-1.jpg
Affichages : 79
Taille : 225,8 Ko
    *En fait, si j'avais dû coder ce truc, au lieu de manipuler un "tableau de cases" d'un côté et un "tableau de barres" de l'autre, j'aurais créé un objet "fichier", objet contenant les éléments sur le fichier ainsi que les éléments graphiques associés comme la case à cocher et la barre de progression. Et ensuite j'aurais simplement traité un "tableau de fichiers" (principes de la POO).

    Après il y a cette histoire de boutons qui disparaissent d'une page à l'autre que j'arrive pas trop à imaginer. Soit ce sont deux pages dédiées à afficher deux infos similaires et là encore on peut dire "je n'utilise qu'une page et je lui fait afficher l'info 1 ou l'info 2 selon le cas" ; soit ce sont deux pages dédiées à afficher deux infos différentes et dans ce cas tu écris le code de chaque page dans des modules (objets, fonctions, etc) bien précis.
    Mais si c'est du style "j'efface le bouton modifier quand il n'y a pas de choses à modifier" alors là tu vas droit dans le mur. C'est en effet ultra déroutant pour un utilisateur de voir des éléments graphiques disparaitre et réapparaitre. Il pensera immédiatement à un bug. Il vaut mieux, si tu veux désactiver un élément grphique selon certains cas, le désactiver donc et le laisser présent mais en grisé.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    juillet 2006
    Messages
    3 424
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Alimentation

    Informations forums :
    Inscription : juillet 2006
    Messages : 3 424
    Points : 6 249
    Points
    6 249
    Par défaut
    Mais je ne dit pas que vos solutions n'iraient pas mais s'il y a un moyen de les différencier pour les réutiliser facilement ensuite au cas par cas je n'ai pas compris comment faire.
    Voici un exemple avec les dictionnaires.

    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
    import tkinter as tk
     
    root = tk.Tk()
     
     
    buttons = {}
    for i in range(5):
        name: str = f"day_{i}"
        button = tk.Button(root, text=i, font="Arial 25", bg="white")
        buttons[name] = button
     
     
    buttons["day_2"].pack()
    buttons["day_4"].pack()
     
     
    root.mainloop()
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #7
    Membre expert Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    septembre 2013
    Messages
    1 886
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : septembre 2013
    Messages : 1 886
    Points : 3 974
    Points
    3 974
    Par défaut
    bonjour
    Citation Envoyé par ImValll Voir le message
    vos propositions de solutions sont intéressantes et j'y avait déjà pensé avant cependant avec celle-ci je n'ai pas l'impression que je pourrai ensuite réutiliser mes boutons.
    Ton code n'est pas assez clair !!! dans ta boucke, day et i ne varient pas (sont-ils différents ?)
    Et pour "réutiliser", il faut un "index" que tu ne donnes justement pas ici.

    Exemple, Si tu as une page par mois et des jours avec un bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    boutons est un dico de dico , pas liste car elle débute à 0 et pas génial pour des jours
    boutons[1][5] = tk.Button(...)    # 5 janvier
    boutons[2][15] = tk.Button(...)  # 15 février
    ...
    boutons[ce_mois][jour_actuel].config(state="disabled")
    Pour moi, il n'y a rien de plus simple
    $moi= ( !== ) ? : ;

Discussions similaires

  1. Adapter le nombre de variables en fonction du nombre d'inputs
    Par michel42 dans le forum Général Python
    Réponses: 8
    Dernier message: 06/04/2012, 08h50
  2. Réponses: 0
    Dernier message: 25/01/2011, 12h34
  3. Titre s'adaptant à la variable choisie
    Par raph1091 dans le forum Webi
    Réponses: 8
    Dernier message: 09/11/2010, 17h34
  4. Adaptation de Code (Constante => Variable)
    Par Kimaos dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 06/04/2010, 10h27
  5. Comment indenter une variable dans un "onclick" ?
    Par shadow54 dans le forum jQuery
    Réponses: 2
    Dernier message: 10/02/2010, 20h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo