Partage
  • Partager sur Facebook
  • Partager sur Twitter

Saisie nombre dans Tkinter

    24 février 2013 à 10:37:55

    Bonjour,

    j'ai lu dans le cours Python qu'il existe le widget Entry pour faire entrer une chaîne de caractères à l'utilisateur, chaîne qui se stocke dans la variable var_texte ici.

    var_texte = StringVar()
    ligne_texte = Entry(fenetre, textvariable = var_texte, width=30)
    ligne_texte.grid(row = 1, column = 1)


    Le problème c'est que même en remplaçant le StringVar() par float() impossible de manipuler cette variable comme un nombre. J'ai un peu cherché "saisie nombre python tkinter" dans Google mais je n'ai rien trouvé. Pourriez-vous me dire comment faire pour faire entrer un nombre par l'utilisateur dans Tkinter ?

    Merci d'avance.

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      24 février 2013 à 11:42:41

      Il existe plusieurs variables de contrôle comme StringVar(), dans ton cas celle qui serait intéressante serait DoubleVar().

      • Partager sur Facebook
      • Partager sur Twitter
        24 février 2013 à 11:56:47

        merci, mais cette fois il me dit "unsupported operand type for * : 'DoubleVar' and 'int'...

        Comme avec Float en fait...

        • Partager sur Facebook
        • Partager sur Twitter
          24 février 2013 à 12:15:15

          Encore un détail :

          Voilà ce que j'obtiens lorsque j'affiche var_texte dans un label en-dessous de OK.
          Pour essayer voici mon programme :
          from tkinter import *
          
          global var_texte
          
          fenetre = Tk()
          
          def quatre() :
              global var_texte
              label.configure(text = var_texte)
          
          
          var_texte = DoubleVar()
          ligne_texte = Entry(fenetre, textvariable = var_texte, width=4)
          ligne_texte.grid(row = 1, column = 1)
          
          bouton = Button(fenetre, text = 'OK',command = quatre)
          bouton.grid(row = 2, column = 1)
          
          
          label = Label(fenetre, text = '...')
          label.grid(row = 3, column = 1)
          
          fenetre.mainloop()
          
          • Partager sur Facebook
          • Partager sur Twitter
            24 février 2013 à 15:11:27

            Ok, c'est fait.

            Pour ceux que ça intéresserait voici comment je m'en suis sorti :

            var_texte = StringVar()
            ligne_texte = Entry(fenetre, textvariable = var_texte, width=4)
            
            Puis un bouton appelant la fonction :
            def quatre() :
                global var_texte
                var_texte = var_texte.get()
                var_texte = float(var_texte)
                var_texte*= 4
                label.configure(text = var_texte)


            Donc je récupère var_texte avec un get() que je restocke dans var_texte. Puis je prends le flot() de var_texte...

            Compliqué mais bon c'est fait c'est l'essentiel  ;-)

            bonne semaine

            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              24 février 2013 à 16:52:20

              Ce n'est pas adapté, même si c'est fonctionnel, fais un effort et lis la doc... DoubleVar est une classe!

              Voici un petit exemple

              >>> root = Tk()
              >>> var = DoubleVar(root, 0.0)
              >>> ent = Entry(root, textvariable=var)
              >>> ent.pack()
              >>> var.set(5.25)
              >>> ent.configure(textvariable=var)
              


              Et vire ce global, on peut faire plus simple et pythonique ;)

              Edit:

              Je t'ai créé une classe incomplète, car on doit par exemple faire attention de ne pas rentrer du texte à la place d'un nombre flottant... à toi de le compléter si le coeur t'en dis.

              from tkinter import *
              
              class MyEntry(Entry):
                  def __init__(self, master=None, value=0.0):
                      self.var_float = DoubleVar(master, value)
                      Entry.__init__(self, master, textvariable=self.var_float)
                      self.pack()
                  def modify(self, set_val):
                      self.var_float.set(set_val)
                      self.configure(textvariable=self.var_float)
              
              #essai
              
              #avant modification, la valeur par défaut est 0.0
              root = Tk()
              ent = MyEntry(root)
              
              input() #appuyer sur une touche
              
              ent.modify(12.5) #modification de la valeur du champ 0.0 par 12.5 
              
              input() #appuyer sur une touche



              -
              Edité par Anonyme 24 février 2013 à 17:07:49

              • Partager sur Facebook
              • Partager sur Twitter
                24 février 2013 à 17:11:25

                M

                -
                Edité par luigi057 24 février 2013 à 17:12:31

                • Partager sur Facebook
                • Partager sur Twitter
                  24 février 2013 à 17:11:55

                  Merci, maintenant un autre problème se pose à moi.

                  J'ai un tableau qui ressemble à ceci :

                  Je devrais récupérer les valeurs des cases.

                  Seulement le programme devrait pouvoir créer des lignes de cases à l'infini (théoriquement) donc elles sont crées avec une boucle et elles ont toujours la même variable de valeur (je pense que je ne suis pas dans la bonne direction?).

                  Je débute vraiment en Python et peut-être que ce genre de manip' est impossible ou trop complexe avec Tkinter ???

                  Le but est de créer un dessin à partir des valeurs données dans le tableau dans un canevas.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    24 février 2013 à 17:22:39

                    Si tu es dans la bonne direction, seulement tu dois dans ta boucle placer une ligne permettant d'ajouter dans une liste tes objets créés au fur et à mesure.

                    Exemple:

                    from tkinter import *
                    
                    root = Tk()
                    
                    liste = []
                    for i in range(5):
                        ent = Entry(root)
                        liste.append(ent)
                        ent.pack()
                        
                    
                    input()
                    
                    print(liste[0].get()) #Affiche la valeur du 1er champ de saisie



                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 février 2013 à 18:39:08

                      Alors j'ai essayé cette technique de la manière suivante :

                                  series_var = DoubleVar()
                                  series_ = Entry(tableau, width = 5, textvariable =series_var)
                                  series_.grid(row =nombre_lignes, column = i)
                                  series_var = series_var.get()
                                  series_var = float(series_var)
                                  liste_series.append(series_var)

                      Voilà ce qui concerne la première colonne du tableau. je stocke series_var dans liste_series. Cela se passe à chaque fois que j'appuie sur le bouton ajouter une ligne...

                      Puis j'appelle liste_series[0] (qui est globale) dans une autre fonction et là il dit List Index Out Of Range, j'imagine que la liste est vide...

                      je précise juste qu'il y a sûrement plein de trucs qui sont pas très catholiques et tout mais je fais avec ce que je sais, ç-à-d pas grand chose, le programme s'améliorera au fur et à mesure de mon apprentissage de Python... ;)

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        24 février 2013 à 18:53:44

                        Tout est catholique, il te manque juste les bases. Pourquoi n'utilises-tu pas ma classe que j'ai créée plus haut?

                        Bref passons... tu as 2 étapes :

                        1) Création du tableau

                        2) Récupération des valeurs

                        Commençons par l'étape 1, comment crées-tu ton tableau? Essai de me donner une fonction ou une classe qui lorsque je l'appelle, envoi le tableau, possible?

                        • Partager sur Facebook
                        • Partager sur Twitter
                          24 février 2013 à 19:09:06

                          def ajouter_ligne(): # Pour le bouton ajouter du tableau---------------------
                              global nombre_lignes
                              global liste_series, liste_stations, liste_longueurs, liste_pentes
                              global liste_azimuts, liste_gauches, liste_droites, liste_hauts
                              global liste_bas, liste_commentaires
                              i = 1
                              while i<11:
                                  if i == 1:#Séries
                                      series_var = DoubleVar()
                                      series_ = Entry(tableau, width = 5, textvariable =series_var)
                                      series_.grid(row =nombre_lignes, column = i)
                                      series_var = series_var.get()
                                      series_var = float(series_var)
                                      liste_series.append(series_var)
                                      
                                  if i == 2:#Stations
                                      stations_var = DoubleVar()
                                      stations_ = Entry(tableau, width = 5, textvariable =stations_var)
                                      stations_.grid(row =nombre_lignes, column = i)
                                      stations_var = stations_var.get()
                                      stations_var = float(stations_var)
                                      liste_stations.append(stations_var)
                                      
                                  if i == 3:#Longueur
                                      longueurs_var = DoubleVar()
                                      longueurs_ = Entry(tableau, width = 5, textvariable =longueurs_var)
                                      longueurs_.grid(row =nombre_lignes, column = i)
                                      longueurs_var = longueurs_var.get()
                                      longueurs_var = float(longueurs_var)
                                      liste_longueurs.append(longueurs_var)
                          
                                  if i == 4:#Azimut
                                      azimuts_var = DoubleVar()
                                      azimuts_ = Entry(tableau, width = 5, textvariable =azimuts_var)
                                      azimuts_.grid(row =nombre_lignes, column = i)
                                      azimuts_var = azimuts_var.get()
                                      azimuts_var = float(azimuts_var)
                                      liste_azimuts.append(azimuts_var)
                                      
                                  if i == 5:#Pente
                                      pentes_var = DoubleVar()
                                      pentes_ = Entry(tableau, textvariable = pentes_var, width = 5)
                                      pentes_.grid(row =nombre_lignes, column = i)
                                      pentes_var = pentes_var.get()
                                      pentes_var = float(pentes_var)
                                      liste_pentes.append(pentes_var)
                          
                                  if i == 6:#Haut
                                      hauts_var = DoubleVar()
                                      hauts_ = Entry(tableau, width = 5, textvariable =hauts_var)
                                      hauts_.grid(row =nombre_lignes, column = i)
                                      hauts_var = hauts_var.get()
                                      hauts_var = float(hauts_var)
                                      liste_hauts.append(hauts_var)
                                      
                                  if i == 7:#Bas
                                      bas_var = DoubleVar()
                                      bas_ = Entry(tableau, width = 5, textvariable =bas_var)
                                      bas_.grid(row =nombre_lignes, column = i)
                                      bas_var = bas_var.get()
                                      bas_var = float(bas_var)
                                      liste_bas.append(bas_var)
                                      
                                  if i == 8:#Gauche
                                      gauches_var = DoubleVar()
                                      gauches_ = Entry(tableau, width = 5, textvariable =gauches_var)
                                      gauches_.grid(row =nombre_lignes, column = i)
                                      gauches_var = gauches_var.get()
                                      gauches_var = float(gauches_var)
                                      liste_gauches.append(gauches_var)
                                      
                                  if i == 9:#Droite
                                      droites_var = DoubleVar()
                                      droites_ = Entry(tableau, width = 5, textvariable =droites_var)
                                      droites_.grid(row =nombre_lignes, column = i)
                                      droites_var = droites_var.get()
                                      droites_var = float(droites_var)
                                      liste_droites.append(droites_var)
                                      
                                  if i == 10:#Commentaires
                                      commentaires_var = DoubleVar()
                                      commentaires_ = Entry(tableau, width = 65, textvariable =commentaires_var)
                                      commentaires_.grid(row =nombre_lignes, column = i)
                                      commentaires_var = commentaires_var.get()
                                      commentaires_var = float(commentaires_var)
                                      liste_commentaires.append(commentaires_var)
                                      
                                  i+=1
                              ligne_suivante.grid(row =nombre_lignes, column = 11)        
                              nombre_lignes+=1
                          
                          
                          creer_menus(tableau)
                          
                          #En-tetes------------------------------------------------------------------
                          serie = Label(tableau, text='Série', font=(14))
                          serie.grid(row=1, column=1)
                          station = Label(tableau, text='Station', font=(14))
                          station.grid(row=1, column=2)
                          longueur = Label(tableau, text='L', font=(24))
                          longueur.grid(row=1, column=3)
                          azimut = Label(tableau, text='N', font=(28))
                          azimut.grid(row=1, column=4)
                          pente = Label(tableau, text='±', font=(28))
                          pente.grid(row=1, column=5)
                          gauche = Label(tableau, text='←', font=(28))
                          gauche.grid(row=1, column=6)
                          droite = Label(tableau, text='→', font=(28))
                          droite.grid(row=1, column=7)
                          haut = Label(tableau, text='↑', font=(28))
                          haut.grid(row=1, column=8)
                          bas = Label(tableau, text='↓', font=(28))
                          bas.grid(row=1, column=9)
                          commentaires = Label(tableau, text='Commentaires', font=(14))
                          commentaires.grid(row=1, column=10)
                          suivant = Label(tableau, text='', font=(14))
                          suivant.grid(row=1, column=11)
                          
                          ligne_suivante = Button(tableau, text='Ajouter', command=ajouter_ligne)
                          ligne_suivante.grid(row = nombre_lignes, column = 11)
                          
                          ajouter_ligne()
                          
                          
                          tableau.mainloop()
                          

                          Voici la partie création du tableau.

                          En fait un classe je sais même pas ce que c'est :waw: (mais je suis le cours SdZ python.....) c'est pour ça que je l'ai pas utilisée......

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            24 février 2013 à 19:55:17

                            Ok, essai cette fonction

                            from tkinter import *
                            
                            def create_arr(n_line, n_column):
                                """Crée un tableau d'objet Entry en fonction du nombre de lignes et colonnes"""
                                
                                list_ent = []
                                
                                for i in range(n_line):
                                    for j in range(n_column):
                                        var_float = DoubleVar(root, 0.0)
                                        ent = Entry(root, textvariable=var_float)
                                        ent.grid(row=i, column=j)
                                        list_ent.append(ent)
                                        
                                return list_ent
                            
                            def read_arr(list_entry):
                                for ind, value in enumerate(list_entry):
                                    print("valeur {0} = {1}".format(ind, value.get()))
                            
                            root = Tk()
                            
                            list_entry = create_arr(5, 11)
                            
                            input()
                            
                            read_arr(list_entry)
                            
                            root.mainloop()



                            Edit : J'ai vu une petite erreur, je modifie!

                            -
                            Edité par Anonyme 24 février 2013 à 20:25:46

                            • Partager sur Facebook
                            • Partager sur Twitter
                              24 février 2013 à 20:38:36

                              Merci beaucoup. En fait pour être clair le but du programme est le suivant : Il doit permettre à l'utilisateur de rentrer des mesures dans le tableau (direction, pente, longeur, sections, etc...). Ces mesures doivent être retravaillées afin de créer un schéma sous forme de canevas. ( la fonction pour le dessin est déjà crée manque juste le transfert entre le tableau et une liste qui contiendrait les mesures).

                              J'en profite pour poser quelques question :

                              - peut-on faire exporter un dessin canevas en PDF ou autre à l'utilisateur ?

                              - peut on faire des manip' sur le canevas (zoom, impression, etc...)

                              J'essaie avec la fonction...

                              -
                              Edité par luigi057 24 février 2013 à 20:49:58

                              • Partager sur Facebook
                              • Partager sur Twitter
                              Anonyme
                                24 février 2013 à 20:51:03

                                En rapport avec mon code, tu dois pouvoir faire ce que tu veux seul, il y a pas grand chose à modifier.

                                Sinon pour l'erreur, je l'ai édité, mon code fonctionne maintenant très bien et fait ce qu'il doit.

                                Pour le reste je ne sais pas, je ne travaille pas assez sur Tkinter, faut se taper la doc...

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  24 février 2013 à 20:57:39

                                  Ok un grand Merci j'essaie de me débrouiller.
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Saisie nombre dans Tkinter

                                  × 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