Partage
  • Partager sur Facebook
  • Partager sur Twitter

Retrun dans un sous-programme

Sujet résolu
    31 décembre 2016 à 12:36:27

    Bonjour à tous,

    Je viens d'écrire un sous-programme, appelé par le programme principale, dont voici le code :

    from __future__ import division
    from tkinter import *
    from tkinter.messagebox import *
    
    def geoliste(g):
        r=[i for i in range(0,len(g)) if not g[i].isdigit()]
        return [int(g[0:r[0]]),int(g[r[0]+1:r[1]]),int(g[r[1]+1:r[2]]),int(g[r[2]+1:])]
    
    def ModeIndex(event):
        var = liste.curselection()
        mode = liste.get(var)
        return mode
    
    def modeVerif(mode):
        global liste, Fenetre
        mode = ""
        modeList = ['CW','SSB','AM','FM',
                    'RTTY','SSTV','PACTOR','PSK',
                    'ATV','CLOVER','GTOR','MTOR',
                    'PSK31','HELL','MT63','QRSS','CWQ',
                    'BPSK31','MFSK','JT44','FSK44',
                    'WSJT','AMTOR','THROB','BPSK63',
                    'PACKET','OLIVIA','MFSK16','JT6M',
                    'JT65','JT65A','JT65B','JT65C',
                    'JT9T','FSK441','PSK125','PSK63',
                    'WSPR','PSK250','ROS'
                    ]
    
        for i in modeList:
            if mode.upper() == i:
                return mode.upper()
    
        
        rep = askyesno ('Mode incompatible',"Le mode choisis n'est pas compatible avec la liste. Voulez-vous le modifier en choisissant dans la liste ?")
        if rep == False:
            return modeList[1]
    
        if rep == True:
            FenetreListe = Tk()
            titre="Choix du mode."
            FenetreListe.title(titre)
            FenetreListe.resizable(False, False)
            FenetreListe.geometry("170x220")
            FenetreListe.config(bg='White')
    
            """Positionne la nouvelle fenetre au centre de l'écran"""
            FenetreListe.update_idletasks()
            l,h,x,y=geoliste(FenetreListe.geometry())
            FenetreListe.geometry("%dx%d%+d%+d" % (l,h,(FenetreListe.winfo_screenwidth()-l)//2,(FenetreListe.winfo_screenheight()-h)//2))
    
            """Défilement vertical"""
            yDefilB = Scrollbar(FenetreListe, orient='vertical')
            yDefilB.grid(row=0, column=1, sticky='ns')
    
            liste = Listbox(FenetreListe,
                            height=10,
                            width=15,
                            font='Arial 12',
                            yscrollcommand=yDefilB.set
                            )
            Index=0        
            for i in modeList:
                liste.insert(Index, i)
                Index += 1
    
            liste.bind('<ButtonRelease-1>',ModeIndex)
            liste.grid(row=0, column=0)
            yDefilB['command'] = liste.yview
            mainloop()
    

    Lorsque je choisis une option dans ma Listbox, j'appelle 'ModeIndex'.

    Dans ce def, je prends la valeur choisie par l'action sur la souris dans la liste

    def ModeIndex(event):
        var = liste.curselection()
        mode = liste.get(var)
        return mode
    

    et je voudrais sortir de l'ensemble et retourner à mon programme principal, en retournant la variable 'mode'.

    Mais le 'return mode' dans le 'def' me renvoie d’où je viens, et ne me sort pas du sous programme, je ne retourne pas à mon programme principal !

    Comment pourrais-je procéder ?

    Merci à vous,

    Geoffroy

    Python 3.5.2

    -
    Edité par GeoffroyThib 31 décembre 2016 à 15:26:34

    • Partager sur Facebook
    • Partager sur Twitter
      31 décembre 2016 à 15:34:48

      Salut,

      Pour faire simple, il vous faudrait une variable, qui communique entre les deux.

      Donc, à la place de:

      def ModeIndex(event):
          var = liste.curselection()
          mode = liste.get(var)
          return mode

      Il faudrait quelque chose comme:

      myVariable = tk.StringVar() #Ou variable simple
      
      def ModeIndex(event):
          var = liste.curselection()[0]
          mode = liste.get(var)
          myVariable = mode #Sauvegarder vers la variable GLOBALE
      
          FenetreListe.destroy() #Détruit la fenêtre

      Ensuite, lorsque vous retournez vers votre fenêtre principale, vous regarder la variable maVariable.

      Faite attention, liste.curselection() retourne un tuple, vous devez choisir le premier élément du tuple.

      Donc, [0]

      liste.curselection()[0]



      Bonne chance

      A+

      -
      Edité par nolimitech 31 décembre 2016 à 15:36:10

      • Partager sur Facebook
      • Partager sur Twitter
        2 janvier 2017 à 10:52:00

        Bonjour,

        Tout d'abord, bonne année 2017 à tous ! :magicien:

        Merci pour ta réponse.

        J'ai donc modifier mon programme comme suit :

        Le programme principal appelle la fonction :

                if i == 4:
                    z = modeVerif(familyTableau, myVariable)
                    mode = myVariable.get()
                    print (myVariable.get(), 'Principal')
                    dico[num][family] = mode
                    defaultSet(i, mode)
        

        et myVariable est définie dans mon programme principal comme suit :

        Fenetre = Tk()
        Titre = "Classement cartes QSL."
        Fenetre.title(Titre)
        Fenetre.update()
        Fenetre.resizable(False, False)
        Fenetre.geometry("1200x800")
        myVariable = tk.StringVar()
        

        Et mon sous-programme est donc le suivant :

        from __future__ import division
        from tkinter import *
        from tkinter.messagebox import *
         
        def geoliste(g):
            r=[i for i in range(0,len(g)) if not g[i].isdigit()]
            return [int(g[0:r[0]]),int(g[r[0]+1:r[1]]),int(g[r[1]+1:r[2]]),int(g[r[2]+1:])]
         
        def ModeIndex(event):
            var = liste.curselection()[0]
            mode = liste.get(var)
            print (mode, 'ModeIndex')
            FenetreListe.destroy()
            myVariable.set(value=mode)
            
        
        
        
        def modeVerif(var, Variable):
            global liste, FenetreListe, myVariable
            myVariable = Variable
            mode=var
            
            print (mode, 'modeVerif')
            modeList = ['CW','SSB','AM','FM',
                        'RTTY','SSTV','PACTOR','PSK',
                        'ATV','CLOVER','GTOR','MTOR',
                        'PSK31','HELL','MT63','QRSS','CWQ',
                        'BPSK31','MFSK','JT44','FSK44',
                        'WSJT','AMTOR','THROB','BPSK63',
                        'PACKET','OLIVIA','MFSK16','JT6M',
                        'JT65','JT65A','JT65B','JT65C',
                        'JT9T','FSK441','PSK125','PSK63',
                        'WSPR','PSK250','ROS'
                        ]
         
            for i in modeList:
                if mode.upper() == i:
                    return mode.upper()
         
             
            rep = askyesno ('Mode incompatible',"Le mode choisis n'est pas compatible avec la liste. Voulez-vous le modifier en choisissant dans la liste ?")
            if rep == False:
                return modeList[1]
         
            if rep == True:
                FenetreListe = Tk()
                myVariable = StringVar()
        
                titre="Choix du mode."
                FenetreListe.title(titre)
                FenetreListe.resizable(False, False)
                FenetreListe.geometry("170x220")
                FenetreListe.config(bg='White')
         
                """Positionne la nouvelle fenetre au centre de l'écran"""
                FenetreListe.update_idletasks()
                l,h,x,y=geoliste(FenetreListe.geometry())
                FenetreListe.geometry("%dx%d%+d%+d" % (l,h,(FenetreListe.winfo_screenwidth()-l)//2,(FenetreListe.winfo_screenheight()-h)//2))
         
                """Défilement vertical"""
                yDefilB = Scrollbar(FenetreListe, orient='vertical')
                yDefilB.grid(row=0, column=1, sticky='ns')
         
                liste = Listbox(FenetreListe,
                                height=10,
                                width=15,
                                font='Arial 12',
                                yscrollcommand=yDefilB.set
                                )
                Index=0       
                for i in modeList:
                    liste.insert(Index, i)
                    Index += 1
         
                liste.bind('<ButtonRelease-1>',lambda event: ModeIndex(event))
                liste.grid(row=0, column=0)
                yDefilB['command'] = liste.yview
        

        On peut remarquer que dans les deux parties (programme principal et sous programme), j'ai mis un 'print () qui me permet de suivre l'évolution des choses.

        Quand je lance le tout, je vois apparaître ceci :

        SS modeVerif
         Principal
        PACTOR ModeIndex

        La première ligne, c'est la variable 'mode' (qui devrait être SSB, on remarque donc une erreur par rapport à la liste) qui est passée au sous-programme. Jusque là, tout va bien ! :soleil:

        La seconde, 'Principal', apparaît DIRECTEMENT après

            rep = askyesno ('Mode incompatible',"Le mode choisis n'est pas compatible avec la liste. Voulez-vous le modifier en choisissant dans la liste ?")
        

        alors qu'aucune réponse venant de la Listbox n'aie été donnée, la réponse du programme principal arrivant en même temps que l'affichage de la Lisbox.

        La troisième ligne, 'PACTOR ModeIndex' est bien la réponse prise dans la boite, l'affichage venant de :

        def ModeIndex(event):
            var = liste.curselection()[0]
            mode = liste.get(var)
            print (mode, 'ModeIndex')
            FenetreListe.destroy()
            myVariable.set(value=mode)
          

        et plus aucune variable passée au programme principal .... :(:colere2:

        Là, il y à une situation que je ne parviens pas à comprendre, peut-être que j'utilise mal les passages de variables ?

        Merci à vous.

        Geoffroy.

        Python 3.5.2




        • Partager sur Facebook
        • Partager sur Twitter

        Retrun dans un sous-programme

        × 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