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

Tkinter Python Discussion :

Liste en série / liste randomisée


Sujet :

Tkinter Python

  1. #21
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 133
    Points : 69
    Points
    69
    Par défaut
    c'est tout à fait clair, merci pour ces précisions

    si j'ai bien capté, lorsque mes questions seront au nombre de 4 (car j'ai des listes où les textes ont seulement 4 questions associées) le code deviendra :

    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
    def L1():
        if(compteur.get()%5 == 0):
          if(compteur.get()/5 < len(liste1)):
            str_texte.set(liste1[compteur.get()/5])
          else:
            str_texte.set("Fin des questions!")
          str_quest.set("")
        else:
          if(compteur.get()/5 < len(liste1)):  
            num_texte = compteur.get()/5
            a=randrange(len(questions[num_texte]))
            str_quest.set(questions[num_texte][a])
            del questions[num_texte][a]
     
        compteur.set(compteur.get()+1)

  2. #22
    Membre actif Avatar de Gaillac
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2008
    Messages : 165
    Points : 209
    Points
    209
    Par défaut
    arrrr

    ça change tout.

    Avec ce système tu ne peux pas changer en cours de route ton diviseur.
    On pourrait imaginer un système de modulo variable, mais ça n'a plus aucun sens mathématique :
    Petit exemple : tes 4 premiers textes ont 5 questions chacun, les 6 suivants 4.
    0 module 6 => 0
    5+1 = 6 modulo 6 => 0
    6+5+1 = 12 modulo 6 => 0
    12+5+1 = 18 modulo 6 => 0
    et là on passe à 4 questions :
    18+4+1 = 24 modulo 5 => 4, c'est le drame.

    Il y aurait moyen de s'en sortir an comptant combien de 5 et combien de 4, mais à ce compte là autant utiliser 2 compteurs, un pour les textes un pour les questions.

    Mais l'inspiration venant en postant, je te propose une alterative avec un seul compteur et sans modulo. Tu l'initialise à 0. Faute de mieux, parce que j'ai du mal à me concentrer, tu déclare aussi un booléen "premiere_fois" que tu initialise à Vrai.

    Dans ta fonction tu créé une variable locale disons cptr_Question.
    Premier test :
    Si premiere_fois est à vrai, alors cptr_Question = 0
    sinon tu affecte longueur de questions[cptr_Texte] à cptr_Question
    (fin de si)

    Puis tu teste ta nouvelle variable
    Si elle vaut 0, y compris la première fois :
    Tu reteste le booléen. S'il est vrai, tu le passe à faux. Sinon tu incrémente le compteur.
    (fin de si)
    ensuite tu affiche ton texte (str_texte.set(lst_Texte[compteur.get()])) si compteur est inférieur (strictement) à la taille de ta liste de texte (sinon, comme avant tu affiche (ou pas) le petit message d'insulte gentillette signifiant à l'utilisateur étourdi qu'il n'y a plus de questions).

    Sinon, tu fais ton tirage aléatoire sans remise classique, avec un randrange(len(questions[compteur.get()])) etc... jusqu'au del.

    fin de si, fin de tout.

    J'ai de la famille à la maison, ça a été un peu galère. Je te donne un exemple en pseudo-code demain, voire en python, et si je suis inspiré je fais sans booléen supplémentaire.

    Ou encore mieux, tu trouve une meilleure solution!

    Si tu ne comprends pas un truc, demande, d'autant plus que je me sui speu être planté, avec mes phrase réécrites 10 fois!

  3. #23
    Membre actif Avatar de Gaillac
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2008
    Messages : 165
    Points : 209
    Points
    209
    Par défaut
    En python ça donne ça :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    # -*- coding: cp1252 -*-
     
    #! /usr/bin/env python
    # -*- coding: cp1252 -*-
     
    from Tkinter import *
    from random import randrange
     
     
    liste1=["texte1","texte2","texte3","texte4","texte5","texte6"]
    questions=len(liste1)*[0]
     
    questions[0]=["0.En 2010, la première plage réfrigérée au monde devrait voir le jour à...",
    "0.En Serbie, deux lionceaux viennent de naître au zoo de Belgrade, ils vont ainsi permettre de renforcer les effectifs de l'espèce menacée des lions...",
    "0.Parmi ces espèces de tigres, laquelle est définitivement éteinte ?",
    "0.L'Agence de protection américaine de l'environnement s'apprête à publier une liste d'individus recherchés pour leurs...",
    "0.Récemment, dans quel pays européen des analyses ont montré une contamination à la dixione de certains élevages de porcs et de bovins ?"]
     
    questions[1]=["1.Mardi dernier, la France a été condamnée à une amende de 10 millions d'euros pour avoir tardé à appliquer une loi européenne...",
    "1.Dans l'Union européenne, en quelle année la commercialisation des ampoules traditionnelles sera interdite au profit des ampoules basse consommation ?",
    "1.Hier, 57 écologistes ont été arrêtés après avoir paralysé l'aéroport londonien de...",
    "1.Selon un sondage publié par les Ateliers de la Terre, quel pourcentage des français considèrent que la réduction du nombre des espèces animales et végétales met en danger la survie de l'homme ?",
    "1.Hier avait lieu la Journée mondiale d'action contre..."]
     
    questions[2]=["2.Mardi dernier, la France a été condamnée à une amende de 10 millions d'euros pour avoir tardé à appliquer une loi européenne...",
    "2.Dans l'Union européenne, en quelle année la commercialisation des ampoules traditionnelles sera interdite au profit des ampoules basse consommation ?",
    "2.Hier, 57 écologistes ont été arrêtés après avoir paralysé l'aéroport londonien de...",
    "2.Selon un sondage publié par les Ateliers de la Terre, quel pourcentage des français considèrent que la réduction du nombre des espèces animales et végétales met en danger la survie de l'homme ?",
    "2.Hier avait lieu la Journée mondiale d'action contre..."]
     
    questions[3]=["3.Mardi dernier, la France a été condamnée à une amende de 10 millions d'euros pour avoir tardé à appliquer une loi européenne...",
    "3.Dans l'Union européenne, en quelle année la commercialisation des ampoules traditionnelles sera interdite au profit des ampoules basse consommation ?",
    "3.Hier, 57 écologistes ont été arrêtés après avoir paralysé l'aéroport londonien de...",
    "3.Selon un sondage publié par les Ateliers de la Terre, quel pourcentage des français considèrent que la réduction du nombre des espèces animales et végétales met en danger la survie de l'homme ?",
    "3.Hier avait lieu la Journée mondiale d'action contre..."]
     
    questions[4]=["4.Mardi dernier, la France a été condamnée à une amende de 10 millions d'euros pour avoir tardé à appliquer une loi européenne...",
    "4.Dans l'Union européenne, en quelle année la commercialisation des ampoules traditionnelles sera interdite au profit des ampoules basse consommation ?",
    "4.Hier, 57 écologistes ont été arrêtés après avoir paralysé l'aéroport londonien de...",
    "4.Selon un sondage publié par les Ateliers de la Terre, quel pourcentage des français considèrent que la réduction du nombre des espèces animales et végétales met en danger la survie de l'homme ?"]
     
    questions[5]=["5.Mardi dernier, la France a été condamnée à une amende de 10 millions d'euros pour avoir tardé à appliquer une loi européenne...",
    "5.Hier, 57 écologistes ont été arrêtés après avoir paralysé l'aéroport londonien de...",
    "5.Selon un sondage publié par les Ateliers de la Terre, quel pourcentage des français considèrent que la réduction du nombre des espèces animales et végétales met en danger la survie de l'homme ?",
    "5.Hier avait lieu la Journée mondiale d'action contre..."]
     
    fen1 = Tk()
    fen1.configure(bg='white')
    fen1.title("PIA")
    larg,haut=fen1.winfo_screenwidth()-100,fen1.winfo_screenheight()-100
    fen1.overrideredirect(1)
    fen1.geometry("%dx%d+0+0"%(larg,haut))
    cadre=Frame(fen1, bg='white',width=2000, height=2000)
    cadre.place(x=160, y=120)	
    cadre2=Frame(fen1, bg='white',width=1000, height= 300, relief=RIDGE)
    cadre2.place(x=160, y=600)
    int_Compteur = IntVar()
    int_Compteur.set(0)
    b_Premiere_Fois = BooleanVar()
    b_Premiere_Fois.set(True)
    str_texte=StringVar()
    str_quest=StringVar()
    msg_texte = Message(cadre, textvariable=str_texte, bg='white',font='Colibri 35', justify='left', width=1000).pack()
    msg_quest = Message(cadre2, textvariable=str_quest, bg='white',font='Colibri 35', justify='left', width=1000).pack()
     
     
    def L1():
        cptr_Question = IntVar()
        if(b_Premiere_Fois.get()):
          cptr_Question.set(0)
        else:
          cptr_Question.set(len(questions[int_Compteur.get()]))
     
        if(cptr_Question.get()==0):
          if(b_Premiere_Fois.get()):
            b_Premiere_Fois.set(False)
          else:
            int_Compteur.set(int_Compteur.get()+1)        
          if(int_Compteur.get() < len(liste1)):
            str_texte.set(liste1[int_Compteur.get()])
          else:
            str_texte.set("Fin des questions!")
            int_Compteur.set(int_Compteur.get()-1)    
          str_quest.set("")
        else:
          a=randrange(len(questions[int_Compteur.get()]))
          str_quest.set(questions[int_Compteur.get()][a])
          del questions[int_Compteur.get()][a]
     
     
    Button(fen1,text='Textes',command=L1, bg='grey').place(x=30, y=700)
    Button(fen1,text='Quitter',command=fen1.destroy, bg='grey').place(x=30, y=800)
     
     
    fen1.mainloop()
    A noter une petite modif par rapport à ce que j'ai dit hier : au moment d'afficher "Fin des questions!" je décrémente le compteur.
    Sans cet artifice, si l'utilisateur re-clique malgré tout sur le bouton, on va passer dans le else du premier if, à savoir cptr_Question.set(len(questions[int_Compteur.get()])) avec un compteur trop grand, et du coup générer une erreur du type "out of range".
    En trichant sur le compteur, on revient dans le cas précédent : compteur = len(liste1)-1 => 1er else => cptr_Question vaut 0 (puisque la questions[compteur] est vide) => 1er if, première fois est faux => 1er else => on ré-incrémente le compteur qui est de nouveau trop grand => 2ème else, CQFD

  4. #24
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 133
    Points : 69
    Points
    69
    Par défaut
    quelques jours sans connexion... le temps de repotasser tout çà
    a+

  5. #25
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 133
    Points : 69
    Points
    69
    Par défaut
    Salut gaillac,

    Mon programme se termine et je te remercie de ton aide précieuse.
    Une dernière chose peut-être...
    Est-il possible de remplacer le clique sur le button par un appui sur clavier avec les flèches droite (pour avancer) et gauche (pour revenir en arrière)?

  6. #26
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 133
    Points : 69
    Points
    69
    Par défaut
    j'ai trouvé pour faire avancer les listes :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    # -*- coding: cp1252 -*-
     
    #! /usr/bin/env python
    # -*- coding: cp1252 -*-
     
    from Tkinter import *
    from random import randrange
     
     
    liste1=["texte1","texte2","texte3","texte4","texte5","texte6","texte7","texte8","texte9","texte10"]
    questions=len(liste1)*[0]
    questions[0]=["question1a","question1b","question1c","question1d","question1e"]
    questions[1]=["question2a","question2b","question2c","question2d","question2e"]
    questions[2]=["question3a","question3b","question3c","question3d","question3e"]
    questions[3]=["question4a","question4b","question4c","question4d","question4e"]
    questions[4]=["question5a","question5b","question5c","question5d","question5e"]
    questions[5]=["question6a","question6b","question6c","question6d","question6e"]
    questions[6]=["question7a","question7b","question7c","question7d","question7e"]
    questions[7]=["question8a","question8b","question8c","question8d","question8e"]
    questions[8]=["question9a","question9b","question9c","question9d","question9e"]
    questions[9]=["question10a","question10b","question10c","question10d","question10e"]
     
     
    def go(evt):
        if(compteur.get()%6 == 0):
          if(compteur.get()/6 < len(liste1)):
            str_texte.set(liste1[compteur.get()/6])
          else:
            str_texte.set("Fin des questions!")
          str_quest.set("")
        else:
          if(compteur.get()/6 < len(liste1)):  
            num_texte = compteur.get()/6
            a=randrange(len(questions[num_texte]))
            str_quest.set(questions[num_texte][a])
            del questions[num_texte][a]
     
        compteur.set(compteur.get()+1)
     
    fen1 = Tk()
    fen1.configure(bg='white')
    fen1.title("PIA")
    larg,haut=fen1.winfo_screenwidth(),fen1.winfo_screenheight()
    fen1.overrideredirect(1)
    fen1.geometry("%dx%d+0+0"%(larg,haut))
    cadre=Frame(fen1, bg='white',width=2000, height=2000)
    cadre.place(x=160, y=120)	
    cadre2=Frame(fen1, bg='white',width=1000, height= 300, relief=RIDGE)
    cadre2.place(x=160, y=600)
    compteur = IntVar()
    compteur.set(0)
    str_texte=StringVar()
    str_quest=StringVar()
    msg_texte = Message(cadre, textvariable=str_texte, bg='white',font='Colibri 35', justify='left', width=1000).pack()
    msg_quest = Message(cadre2, textvariable=str_quest, bg='white',font='Colibri 35', justify='left', width=1000).pack()
    ################
    fen1.bind('<Right>',go)# 
    ################
     
    Button(fen1,text='Quitter',command=fen1.destroy, bg='grey').place(x=30, y=900)
     
     
     
    fen1.mainloop()
    Mais pour reculer.....

  7. #27
    Membre actif Avatar de Gaillac
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2008
    Messages : 165
    Points : 209
    Points
    209
    Par défaut
    Le problème c'est que pour reculer il faut se souvenir de la question précédente, que tu as effacé...

    Donc
    1) ou tu prévois un seul retour en arrière possible, en stoquant dans une chaine temporaire ta question avant de l'effacer.
    2) ou tu généralise ce système, et au lieu de supprimer la question tu la mets en queue d'une autre liste, vide au début, qui contient toutes tes anciennes question (successives).
    3) ou tu gère un système de liste de question temporaire pour chaque texte, que tu remplie avec tes ( questions à chaque nouveaux texte à partir de tes listes de question initiales, et pendant que tu gère l'algorithme normal avec cette liste temporaire, tu stocks les indices des questions posés (dans l'ordre) et tu te sert de cette liste d'indice pour relire dans les tableaux initiaux les questions précédentes. Me semble la solution la plus compliqué.

    liste non exhaustive.
    Mais si tu autorise à revenir en arrière, il faudra le faire de manière synchrone pour les questions et les réponses!

Discussions similaires

  1. [Lisp][IA] Supprimer une liste d'une liste de listes
    Par Superleo2999 dans le forum Lisp
    Réponses: 5
    Dernier message: 22/03/2010, 10h51
  2. caster une List<Object> en List<..>
    Par K-Kaï dans le forum Langage
    Réponses: 2
    Dernier message: 30/05/2006, 17h43
  3. Réponses: 16
    Dernier message: 22/05/2006, 10h48
  4. Ajout de listes dans une liste
    Par mcdonald dans le forum Général Python
    Réponses: 4
    Dernier message: 10/01/2006, 22h39
  5. [langage] probleme avec les listes dans des listes
    Par pqmoltonel dans le forum Langage
    Réponses: 7
    Dernier message: 27/04/2004, 12h32

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