Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Python + TKinter] Widget Text

Afficher les dernières lignes

Sujet résolu
Anonyme
    21 mai 2010 à 9:05:00

    Bonjour tout le monde,
    Je me suis fait un petit simulateur de lancers de Dés en python avec quelques widgets Tkinter, et les résultats s'affichent dans un widget Text.

    J'ajoute les résultats à la fin du widget comme ceci : zoneTxtResultats.insert(END, str(random.randint(1, selectionDe) ) )

    Les données sont bien entrées à la fin, mais quand le nombre de lignes dépasse la hauteur de la zone, le défilement vers le bas ne se fait pas, malgré la scrollBar que j'ai associée au widget.

    Savez-vous comment faire ? Merci d'avance.

    PS : je vous colle ci-dessous mon code si vous en avez besoin.

    # -*- coding:Utf-8 -*-
    #
    # Scrit python simulant des lancers de dé
    
    # ---------------------------------------------------
    # Imports
    # ---------------------------------------------------
    from Tkinter import *
    import random
    
    # ---------------------------------------------------
    # Variables
    # ---------------------------------------------------
    list_faces_dispo = [3, 4, 6, 8, 10, 12, 20, 100]
    
    # ---------------------------------------------------
    # Fonctions
    # ---------------------------------------------------
    def Intercepte():
        # Interception de la fermeture de la fenetre
        fen.destroy()
    
    def lancerDes():
        """ lance le(s) De(s) quand on clique sur le bouton """
        strMessages.set("Lancement ...")
    
        try:
            selectionDe = listsDesDispos.get(listsDesDispos.curselection())
        except TclError:
            selectionDe = 0
    
        if( (selectionDe == 0) or (selectionDe not in list_faces_dispo) ):
            strMessages.set('Erreur : Il faut selectionner un De dans la liste')
        else:
            nbLancers = spinNbHeures.get()
            i = 1
            zoneTxtResultats.insert(END, "> ")
            while(i <= int(nbLancers)):
                zoneTxtResultats.insert(END, str(random.randint(1, selectionDe) ) )
                i = i + 1
                if(i <= int(nbLancers)):
                    zoneTxtResultats.insert(END, " - ")
    
            strMessages.set('')
            zoneTxtResultats.insert(END, "\n")
        #fin fonction lancerDes()
    
    # ---------------------------------------------------
    # Debut
    # ---------------------------------------------------
    # creation de la fenetre (instance de la classe Tk)
    fen = Tk()
    fen.title('Simulateur Des')
    
    #frames pour organiser
    frame1 = Frame(fen)
    frame2 = Frame(fen)
    frame3 = Frame(fen)
    
    # ****
    # les controles de la fenetre
    # ****
    
    #***list box des dés dispos
    labelListeDes = Label(frame1, text = 'Faces').grid(row = 0, column = 0)
    
    listsDesDispos = Listbox(frame1, width=4, height = 4)
    for elem in list_faces_dispo:
        listsDesDispos.insert(END, elem)
    
    s1 = Scrollbar(frame1)
    s1.config(command = listsDesDispos.yview)
    
    listsDesDispos.config(yscrollcommand = s1.set)
    listsDesDispos.grid(row = 1, column = 0)
    s1.grid(row=1, column=1)
    
    #***bouton pour lancer
    bouton = Button(frame1, text="Lancer", command = lancerDes)
    bouton.grid(row = 1, column = 3)
    
    #***spin box pour le nbre de lancers
    labelSpinNbHeures = Label(frame1, text = 'Nombre de lancers').grid(row = 0, column = 2)
    
    spinNbHeures = Spinbox(frame1, from_ = 1, to = 10, width = 4)
    spinNbHeures.grid(row = 1, column = 2)
    
    #***textarea pour les résultats
    labelZoneTxtResultats = Label(frame2, text = 'Resultats').grid(row = 0, column = 0)
    
    zoneTxtResultats = Text(frame2, width = 30, height = 6)
    
    s2 = Scrollbar(frame2)
    s2.config(command = zoneTxtResultats.yview)
    
    zoneTxtResultats.config(yscrollcommand = s2.set)
    zoneTxtResultats.grid(row = 1, column = 0)
    s2.grid(row = 1, column = 1)
    
    #label de messages de l'appli
    strMessages = StringVar() #a placer après l'instantiation Tk
    messagesAppli = Label(frame3,textvariable=strMessages,fg="red")
    messagesAppli.grid(row = 2, column = 0)
    
    #on place les frames
    frame1.pack()
    frame2.pack()
    frame3.pack()
    
    # intercepter la fermeture de la fenetre pour
    # avoir une fermeture propre du script
    fen.protocol("WM_DELETE_WINDOW", Intercepte)
    # demarrer le gestionnaire d'evenement
    fen.mainloop()
    
    • Partager sur Facebook
    • Partager sur Twitter
      26 mai 2010 à 15:08:26

      Salut,

      Ce n'est peut-être pas la réponse que tu souhaite, mais plutôt qu'afficher le résultat en bas, tu peux l'afficher en haut. Et de cette manière utiliser le scroll pour consulter l'historique des lancers.

      Quelques infos ici : http://effbot.org/tkinterbook/text.htm

      Et en modifiant la section "else" de la fonction "landerDes", en modifiant le paramètre "END" de tes méthodes "insert" par le paramètre "0.0" :
      else:
              zoneTxtResultats.insert(0.0, "\n") #ATTENTION : PERMUTATION
              nbLancers = spinNbHeures.get()
              i = 1
              zoneTxtResultats.insert(0.0, "> ")
              while(i <= int(nbLancers)):
                  zoneTxtResultats.insert(0.0, str(random.randint(1, selectionDe) ) )
                  i = i + 1
                  if(i <= int(nbLancers)):
                      zoneTxtResultats.insert(0.0, " - ")
      
              strMessages.set('')
              
          #fin fonction lancerDes()
      


      Il sera aussi nécessaire de déplacer cette ligne immédiatement après le "else":
      zoneTxtResultats.insert(0.0, "\n")
      



      Ce qui t'intéresse m'intéresse.
      Je poursuis les recherches dans le sens premier de ta demande, à savoir paramétrer le scroll.

      Bonne journée.
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        7 juillet 2010 à 11:12:16

        Bonjour vapula.

        Je suis désolé de ne pas avoir vu ta réponse avant, j'ai été assez occupé depuis le mois de Mai :)

        Je prend note de ta solution qui est une alternative intéressante à mon problème. Je testerais ça ce soir et éditerais ce post pour te tenir au courant.

        Bonne journée.
        • Partager sur Facebook
        • Partager sur Twitter
          7 juillet 2010 à 12:05:51

          Salut,

          J'ai déplacé ton sujet dans le forum Python. :)

          BOnne continuation !
          GuilOooo
          • Partager sur Facebook
          • Partager sur Twitter
          J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
          Anonyme
            7 juillet 2010 à 14:54:40

            Merci GuilOooo pour avoir déplacé mon sujet.

            J'ai pu étudier ton lien vapula, et j'ai trouvé une méthode intéressante associée au widget Text : yview_scroll()

            J'ai pu modifier ainsi ma fonction lancerDes() (voir ligne surlignée à la fin):

            def lancerDes():
                """ lance le(s) De(s) quand on clique sur le bouton """
                strMessages.set("Lancement ...")
            
                try:
                    selectionDe = listsDesDispos.get(listsDesDispos.curselection())
                except TclError:
                    selectionDe = 0
            
                if( (selectionDe == 0) or (selectionDe not in list_faces_dispo) ):
                    strMessages.set('Erreur : Il faut selectionner un De dans la liste')
                else:
                    nbLancers = spinNbHeures.get()
                    i = 1
                    zoneTxtResultats.insert(END, "> ")
                    while(i <= int(nbLancers)):
                        zoneTxtResultats.insert(END, str(random.randint(1, selectionDe) ) )
                        i = i + 1
                        if(i <= int(nbLancers)):
                            zoneTxtResultats.insert(END, " - ")
            
                    strMessages.set('')
                    zoneTxtResultats.insert(END, "\n")
                    zoneTxtResultats.yview_scroll(calcNbPages(), "pages") #scroll vers le bas de x pages
                #fin fonction lancerDes()
            


            Avec la fonction calcNbPages() qui est la suivante:

            def calcNbPages():
                """ Fonction récupérant le nombre de lignes du widget Text
                puis calcule le nombre de pages à partir du nombre de lignes
                par rapport à la hauteur du widget """
                txt = zoneTxtResultats.get(1.0, END)
                listLig = txt.rsplit("\n")
                return (len(listLig) / 6) + 1  #6 étant la hauteur du widget Text
            


            Le tout marche donc très bien, je te remercie donc beaucoup :)
            Mon sujet est résolu, mais j'avoue que comme tu l'as proposé, je me demande si cela n'est pas mieux en effet d'insérer en début de widget, puis de descendre pour avoir l'historique ...

            Question bonus, ça serait utile d'ajouter un compteur qui s'incrémente pour indiquer quel est le numéro du jet ? Ou ça surchargerait l'affichage ?

            Bonne journée.
            • Partager sur Facebook
            • Partager sur Twitter
              7 juillet 2010 à 18:31:27

              Ravi d'avoir pu t'aider.

              Quant-au fait de mettre un compteur de lancé, c'est toi qui voit en fonction de ton utilisation.
              Je pense que placer le nombre juste avant le '>' risque de rendre le résultat moins bien visible.
              Par contre, si tu mets le nombre de lancés dans le label sous le textarea, ça devrait aller.

              Bonne fin de journée.
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                8 juillet 2010 à 14:12:52

                Finalement, je ne place pas de nombre avant le '>', mais j'indique de quel type de dé il s'agit, ce qui est à mon avis, beaucoup plus utile.
                • Partager sur Facebook
                • Partager sur Twitter

                [Python + TKinter] Widget Text

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown