Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problemes fonction

Fonction cryptographie

Sujet résolu
    23 mai 2018 à 16:07:57

    Je travail sur un programme de cryptographie et j'utilise une fonction pour crypter mon message.

    Seulement la fonction m'affiche l’erreur suivante et je ne comprend pas pourquoi cela ne marche pas.

     Voici mon code :

    from tkinter import *
    
    #-------------------------On définis les fonctions--------------------------
    liste = []
    liste1 = []
    
    
    def lettre(n):
        return chr(n+65)
    
    def num(caractere):
        return ord(caractere)-65
    
    
    
    def fn1() :
        def valider() :
            a = s.get()
            b = sp1.get()
            c = sp2.get()
            liste[:] = [a, b, c]
    
    
            return liste
            fn.destroy
    
    
    
        fn = Toplevel()
        fn.geometry("300x200")
    
        messagenoncodé = Label(fn, text = "Votre message doit être en majuscules uniquement!").pack()
    
        entryVar = StringVar()
        s = Entry( fn, textvariable = StringVar() )
        s.pack( side=TOP )
    
        cond1 = Label(fn, text="Le premier coéfficient doit être impair !").pack()
    
        spinVar1 = IntVar()
        sp1 = Spinbox( fn, from_=0, to=26, textvariable = IntVar() )
        sp1.pack()
    
        spinVar2 = IntVar()
        sp2 = Spinbox( fn, from_=0, to=999, textvariable = IntVar() )
        sp2.pack()
    
        Canvas(fn, width = 50, height = 10).pack()
    
        but1 = Button(fn, text ='Valider', command = valider).pack(side = LEFT, padx = 3, pady = 3)
        but4 = Button(fn, text= 'Chiffrer', command = codage).pack(side = TOP, padx = 3, pady = 3)
        but2 = Button(fn, text ='Dechiffrer').pack(side = RIGHT, padx = 3, pady = 3)
        but3 = Button(fn, text = 'Quitter', command = fn.destroy).pack(side = BOTTOM, padx = 3, pady = 3)
    
        lab = Label(fn).pack
    
    
    def codage() :
    
        C = 0
        x = liste[0]
        for C in x :
            y = (num(C)*liste[1]+liste[2])%26
            liste1.append(y)
        print(liste1)
        print("est votre message codé !")

    Et voici l"erreur rencontrée :

    
    Traceback (most recent call last):
      File "F:\EduPython\App\lib\tkinter\__init__.py", line 1538, in __call__
        return self.func(*args)
      File "F:\Projet cryptographie\ISN\programme.py", line 63, in codage
        y = (num(C)*liste[1]+liste[2])%26
    TypeError: not all arguments converted during string formatting

    Merci pour votre attention.


    • Partager sur Facebook
    • Partager sur Twitter
      23 mai 2018 à 16:35:50

      TypeError : je pense qu'il y a une chaine de caractères quelque part dans l'expression ligne 63

      Ajoute un print juste avant qui affiche toutes les variables de l'expression pour voir où est le coupable.

      • Partager sur Facebook
      • Partager sur Twitter

      Blond, bouclé, toujours le sourire aux lèvres...

        23 mai 2018 à 18:06:40

        Salut et merci !

        j'ai fais des petits et j'ai trouvé qui étais le fautif ! C'est le C ( le compteur de taille du x ).

        Seulement je n'arrive toujours pas à ce qu'il passe dans la fonction num.

        elle n'accepte que la forme num('C'), seulement du coup elle ne prend plus la valeur du for.

        Je ne sais pas comment me démêler de cette situation.

        • Partager sur Facebook
        • Partager sur Twitter
          23 mai 2018 à 18:43:48

          Oui mais non, num(C) renvoie bien un entier, donc la variable C n'est pas le problème.

          Regarde ce que contient liste[1] et liste[2], à mon avis les coupables sont là.

          • Partager sur Facebook
          • Partager sur Twitter

          Blond, bouclé, toujours le sourire aux lèvres...

            23 mai 2018 à 18:52:49

            ils contiennent la valeur de mes spinbox.
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              23 mai 2018 à 19:04:12

              Toute façon ça peut pas fonctionner (ligne 16 à 25)

              >>> def test():
              ...     def valider():
              ...         pass
              ... 
              >>> valider()
              Traceback (most recent call last):
                File "<stdin>", line 1, in <module>
              NameError: name 'valider' is not defined
              

              La fonction valider ne peut pas être appelée.

              Ensuite, c'est fn1 qui devrait être appelé, et retourner un callback, donc la fonction valider.

              def fn1():
                  def valider():
                      # blablabla
                      # ...
                  return valider

              Mais, je dirai que faire une closure ici n'est pas utile et complique le code pour rien !


              • Partager sur Facebook
              • Partager sur Twitter
                23 mai 2018 à 21:05:56

                Pourtant lorsque je print list[0], list[1] et liste[2], cela m’affiche bien le mot et les valeurs entrés dans mon entry et mes spinbox.
                • Partager sur Facebook
                • Partager sur Twitter

                Problemes fonction

                × 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