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 :

Tkinter Bind et boucle infinie


Sujet :

Tkinter Python

  1. #1
    Membre averti
    Femme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 272
    Points : 417
    Points
    417
    Par défaut Tkinter Bind et boucle infinie
    Bonjour,
    j'essaie de réaliser une interface graphique et je viens de découvrir sur la FAQ comment associer une fonction avec paramètres grâce à lambda
    J'ai tenté d'appliquer mais mon code tourne dans le vide et je ne sais pas pourquoi
    Voici mon script:
    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
    97
    98
    99
    100
    101
    #! /usr/bin/python
    import Tkinter
    from Tkinter import *
    import tkMessageBox
     
    import re
     
    from Sequence import *
    from Alignement import *
     
    class Application:
        def __init__(self):        
            #Constructeur fenetre principale#
            fenetre = Tk()
            #fenetre.initialize()
     
     
     
            #Entree des donnees
            fenetre.title('Alignement de séquences')
            Label(fenetre, text = "Rentrez vos séquences:", fg='black', font =("Helvetica", "20")).grid(row = 0, column = 10, sticky='NS')
            Label(fenetre, text = "Séquence1:", fg='blue', font =("Helvetica", "16", "bold italic underline")).grid(row = 2, column = 10, sticky='NS')
            fenetre.entree1 = Entry(fenetre, width =150)
            fenetre.entree1.grid(row = 3, column = 10, sticky='NS')
            seq1=fenetre.entree1.get()
            fenetre.entree1.bind("<Return>", lambda event : self.Check(seq1)) #la séquence est entrée définitivement lorsque l'utlisateur
                                                                    #appuie sur la touche "entrée"
            Label(fenetre, text = "Séquence2:", fg='blue', font =("Helvetica", "16", "bold italic underline")).grid(row = 4, column = 10, sticky='NS')
            fenetre.entree2 = Entry(fenetre, width =150)
            fenetre.entree2.grid(row =5, column = 10, sticky='NS')
            seq2=fenetre.entree2.get()
            fenetre.entree2.bind("<Return>", lambda event : self.Check(seq2))
     
            #Toolbar
            bar = Menu(fenetre)
     
            fichier = Menu(bar)
            fichier.add_command(label="Enregistrer sous...")#, command =)
            fichier.add_separator()
            fichier.add_command(label="Quitter", command = fenetre.destroy)
            methode = Menu(bar)
            methode.add_command(label="M1" )#, command = self.DL(seq1, seq2))
            methode.add_command(label="M2")#, command = )
            methode.add_command(label="M3 ")#, command = )
            methode.add_command(label="M4")#, command = )
            methode.add_command(label="M5")#, command = )
            aide = Menu(bar)
            aide.add_command(label="A propos", command = self.about)
     
            bar.add_cascade(label="Fichier", menu = fichier)
            bar.add_cascade(label="ChoixMéthode", menu = methode)
            bar.add_cascade(label="Aide", menu = aide)
     
            fenetre.config(menu=bar)
     
            #Commande d'alignement des séquences
            bouton = Button(fenetre, text="Choisissez la méthode pour aligner", fg='red', font=("-*-lucidatypewriter-medium-r-*-*-*-200-*-*-*-*-*-*")).grid(row =8,column = 10, sticky='NS')
     
            #Place pour l'alignement des séquences
            liste = Listbox(height=3,width=50).grid(row = 9, column = 10, rowspan = 50, sticky='NSEW')
     
            fenetre.grid_rowconfigure(0, weight = 2)
            fenetre.grid_rowconfigure(2, weight = 2)
            fenetre.grid_rowconfigure(3, weight = 2)
            fenetre.grid_rowconfigure(4, weight = 2)
            fenetre.grid_rowconfigure(5, weight = 2)
            fenetre.grid_rowconfigure(8, weight = 1)
            fenetre.grid_rowconfigure(9, weight = 20)
            fenetre.grid_columnconfigure(10, weight = 2)
            fenetre.wm_state(newstate="zoomed")
            fenetre.mainloop()
     
        def about(self):
            tkMessageBox.showinfo("Principe", "Choisir une méthode et rentrer les deux séquences à aligner...")
     
        def Check(self, seq):
            print "ok"
            motif = r"[^a-zA-Z]"
            if re.search(motif, seq):
                tkMessageBox.showinfo("La séquence entrée n'est pas une suite de lettre", "Tous les éléments n'appartenant pas à l'alphaber seront ignorés")
                s = re.findall('[A-Z]+', seq.upper()) #on ne garde que les lettres de l'alphabet
                seq=''.join(s)
                print seq
            else:
                print "koikispass"
            return seq
     
     
     
        def DL(self, Seq1, Seq2):
            m = len(Seq1)
            n = len(Seq2)
            T = Matrice_cout(Seq1, Seq2)
            L = Alignement(Seq1, Seq2, m+1, n+1, T, [])
            print L
     
     
    # démarrer le gestionnaire d'événement
     
    if __name__ == "__main__":
        i=Application()
    Si quelqu'un pouvait venir à mon secours svp?
    Merci d'avance

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Points : 290
    Points
    290
    Par défaut
    bonjour,

    Qu'appels tu "tourne dans le vide"?
    Si rien ne se passe quand tu cliques sur le bouton "Choisissez la méthode pour aligner", ou les items du menu "choixMéthode", c'est normal tu n'as pas mis d'attribut command.

  3. #3
    Membre averti
    Femme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 272
    Points : 417
    Points
    417
    Par défaut rien ne se passe...
    Citation Envoyé par nyko77 Voir le message
    bonjour,

    Qu'appels tu "tourne dans le vide"?
    Si rien ne se passe quand tu cliques sur le bouton "Choisissez la méthode pour aligner", ou les items du menu "choixMéthode", c'est normal tu n'as pas mis d'attribut command.
    Bonsoir,
    en fait, j'ai supprimé la commande dans "choixMéthode" car je n'arrivais pas à introduire la fonction correspondante.
    Pour mettre en oeuvre lambda, j'ai créé la fonction "Check".
    Mais rien ne s'affiche quelles que soient les séquences entrées et le shell ne me rend le prompt que si je ferme l'interface.
    En espérant que ces explications vous permettent de mieux cerner mon problème...
    Merci d'avance

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Points : 290
    Points
    290
    Par défaut
    ça y est j'ai compris. J'avais pas bien lu ton code.
    Ton problème viens du faite que tu récupère la séquence dans le __init__ (seq1=fenetre.entree1.get()), donc seq1 prend la valeur de l'entry au départ de l'application, c'est à dire un string vide. Il faut que tu récupéres la valeur de l'entry dans ta méthode check.

    Voila un exemple en gardant le lambda pour comprendre son utilisation:

    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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
     
    #! /usr/bin/python
    # -*- coding: utf-8 -*-
     
    import Tkinter
    from Tkinter import *
    import tkMessageBox
     
    import re
     
     
     
    class Application:
    	def __init__(self):
    		#Constructeur fenetre principale#
    		fenetre = Tk()
    		#fenetre.initialize()
     
     
     
     
    		#Entree des donnees
    		fenetre.title('Alignement de séquences')
    		Label(fenetre, text = "Rentrez vos séquences:", fg='black', font =("Helvetica", "20")).grid(row = 0, column = 10, sticky='NS')
    		Label(fenetre, text = "Séquence1:", fg='blue', font =("Helvetica", "16", "bold italic underline")).grid(row = 2, column = 10, sticky='NS')
    		self.entree1 = Entry(fenetre, width =150)
    		self.entree1.grid(row = 3, column = 10, sticky='NS')
     
    		self.entree1.bind("<Return>", lambda event : self.Check(event, 1)) #la séquence est entrée définitivement lorsque l'utlisateur
    																#appuie sur la touche "entrée"
    		Label(fenetre, text = "Séquence2:", fg='blue', font =("Helvetica", "16", "bold italic underline")).grid(row = 4, column = 10, sticky='NS')
    		self.entree2 = Entry(fenetre, width =150)
    		self.entree2.grid(row =5, column = 10, sticky='NS')
     
    		self.entree2.bind("<Return>", lambda event : self.Check(event, 2))
     
    		#Toolbar
    		bar = Menu(fenetre)
     
    		fichier = Menu(bar)
    		fichier.add_command(label="Enregistrer sous...")#, command =)
    		fichier.add_separator()
    		fichier.add_command(label="Quitter", command = fenetre.destroy)
    		methode = Menu(bar)
    		methode.add_command(label="M1" )#, command = self.DL(seq1, seq2))
    		methode.add_command(label="M2")#, command = )
    		methode.add_command(label="M3 ")#, command = )
    		methode.add_command(label="M4")#, command = )
    		methode.add_command(label="M5")#, command = )
    		aide = Menu(bar)
    		aide.add_command(label="A propos", command = self.about)
     
    		bar.add_cascade(label="Fichier", menu = fichier)
    		bar.add_cascade(label="ChoixMéthode", menu = methode)
    		bar.add_cascade(label="Aide", menu = aide)
     
    		fenetre.config(menu=bar)
     
    		#Commande d'alignement des séquences
    		bouton = Button(fenetre, text="Choisissez la méthode pour aligner", fg='red', font=("-*-lucidatypewriter-medium-r-*-*-*-200-*-*-*-*-*-*")).grid(row =8,column = 10, sticky='NS')
     
    		#Place pour l'alignement des séquences
    		liste = Listbox(height=3,width=50).grid(row = 9, column = 10, rowspan = 50, sticky='NSEW')
     
    		fenetre.grid_rowconfigure(0, weight = 2)
    		fenetre.grid_rowconfigure(2, weight = 2)
    		fenetre.grid_rowconfigure(3, weight = 2)
    		fenetre.grid_rowconfigure(4, weight = 2)
    		fenetre.grid_rowconfigure(5, weight = 2)
    		fenetre.grid_rowconfigure(8, weight = 1)
    		fenetre.grid_rowconfigure(9, weight = 20)
    		fenetre.grid_columnconfigure(10, weight = 2)
     
    		fenetre.mainloop()
     
    	def about(self):
    		tkMessageBox.showinfo("Principe", "Choisir une méthode et rentrer les deux séquences à aligner...")
     
    	def Check(self, event, numEntry):
     
    		if numEntry == 1:
    			seq = self.entree1.get()
    		else:
    			seq = self.entree2.get()
     
    		motif = r"[^a-zA-Z]"
    		if re.search(motif, seq):
    			tkMessageBox.showinfo("La séquence entrée n'est pas une suite de lettre", "Tous les éléments n'appartenant pas à l'alphaber seront ignorés")
    			s = re.findall('[A-Z]+', seq.upper()) #on ne garde que les lettres de l'alphabet
    			seq=''.join(s)
    			print seq
    		else:
    			print "koikispass"
    		return seq
     
     
     
    	def DL(self, Seq1, Seq2):
    		m = len(Seq1)
    		n = len(Seq2)
    		T = Matrice_cout(Seq1, Seq2)
    		L = Alignement(Seq1, Seq2, m+1, n+1, T, [])
    		print L
     
     
    # démarrer le gestionnaire d'événement
     
    if __name__ == "__main__":
        i=Application()
    En fait le lambda n'est pas utile dans ton cas, tu peux récupérer l'entry "binder" dans l'event passé en argument avec event.widget:

    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
    97
    98
    99
    100
    101
    102
     
    #! /usr/bin/python
    # -*- coding: utf-8 -*-
     
    import Tkinter
    from Tkinter import *
    import tkMessageBox
     
    import re
     
     
     
    class Application:
    	def __init__(self):        
    		#Constructeur fenetre principale#
    		fenetre = Tk()
    		#fenetre.initialize()
     
    		#Entree des donnees
    		fenetre.title('Alignement de séquences')
    		Label(fenetre, text = "Rentrez vos séquences:", fg='black', font =("Helvetica", "20")).grid(row = 0, column = 10, sticky='NS')
    		Label(fenetre, text = "Séquence1:", fg='blue', font =("Helvetica", "16", "bold italic underline")).grid(row = 2, column = 10, sticky='NS')
    		self.entree1 = Entry(fenetre, width =150)
    		self.entree1.grid(row = 3, column = 10, sticky='NS')
     
    		self.entree1.bind("<Return>", self.Check) #la séquence est entrée définitivement lorsque l'utlisateur
    																#appuie sur la touche "entrée"
    		Label(fenetre, text = "Séquence2:", fg='blue', font =("Helvetica", "16", "bold italic underline")).grid(row = 4, column = 10, sticky='NS')
    		self.entree2 = Entry(fenetre, width =150)
    		self.entree2.grid(row =5, column = 10, sticky='NS')
     
    		self.entree2.bind("<Return>", self.Check)
     
    		#Toolbar
    		bar = Menu(fenetre)
     
    		fichier = Menu(bar)
    		fichier.add_command(label="Enregistrer sous...")#, command =)
    		fichier.add_separator()
    		fichier.add_command(label="Quitter", command = fenetre.destroy)
    		methode = Menu(bar)
    		methode.add_command(label="M1" )#, command = self.DL(seq1, seq2))
    		methode.add_command(label="M2")#, command = )
    		methode.add_command(label="M3 ")#, command = )
    		methode.add_command(label="M4")#, command = )
    		methode.add_command(label="M5")#, command = )
    		aide = Menu(bar)
    		aide.add_command(label="A propos", command = self.about)
     
    		bar.add_cascade(label="Fichier", menu = fichier)
    		bar.add_cascade(label="ChoixMéthode", menu = methode)
    		bar.add_cascade(label="Aide", menu = aide)
     
    		fenetre.config(menu=bar)
     
    		#Commande d'alignement des séquences
    		bouton = Button(fenetre, text="Choisissez la méthode pour aligner", fg='red', font=("-*-lucidatypewriter-medium-r-*-*-*-200-*-*-*-*-*-*")).grid(row =8,column = 10, sticky='NS')
     
    		#Place pour l'alignement des séquences
    		liste = Listbox(height=3,width=50).grid(row = 9, column = 10, rowspan = 50, sticky='NSEW')
     
    		fenetre.grid_rowconfigure(0, weight = 2)
    		fenetre.grid_rowconfigure(2, weight = 2)
    		fenetre.grid_rowconfigure(3, weight = 2)
    		fenetre.grid_rowconfigure(4, weight = 2)
    		fenetre.grid_rowconfigure(5, weight = 2)
    		fenetre.grid_rowconfigure(8, weight = 1)
    		fenetre.grid_rowconfigure(9, weight = 20)
    		fenetre.grid_columnconfigure(10, weight = 2)
     
    		fenetre.mainloop()
     
    	def about(self):
    		tkMessageBox.showinfo("Principe", "Choisir une méthode et rentrer les deux séquences à aligner...")
     
    	def Check(self, event):
    		seq = event.widget.get()
    		motif = r"[^a-zA-Z]"
    		if re.search(motif, seq):
    			tkMessageBox.showinfo("La séquence entrée n'est pas une suite de lettre", "Tous les éléments n'appartenant pas à l'alphaber seront ignorés")
    			s = re.findall('[A-Z]+', seq.upper()) #on ne garde que les lettres de l'alphabet
    			seq=''.join(s)
    			print seq
    		else:
    			print "koikispass"
    		return seq
     
     
     
    	def DL(self, Seq1, Seq2):
    		m = len(Seq1)
    		n = len(Seq2)
    		T = Matrice_cout(Seq1, Seq2)
    		L = Alignement(Seq1, Seq2, m+1, n+1, T, [])
    		print L
     
     
    # démarrer le gestionnaire d'événement
     
    if __name__ == "__main__":
        i=Application()
    )

Discussions similaires

  1. [Python 3.X] PySerial - Tkinter et boucle infinie
    Par Caxton dans le forum Tkinter
    Réponses: 47
    Dernier message: 14/06/2015, 11h44
  2. symptome de la boucle infinie dans une requete
    Par ouam81 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 27/05/2005, 12h10
  3. Réponses: 15
    Dernier message: 24/05/2005, 08h34
  4. [Socket] Pb de boucle infinie
    Par Myogtha dans le forum Entrée/Sortie
    Réponses: 12
    Dernier message: 10/06/2004, 14h10
  5. [C#] Comment eviter les boucles infinies ?
    Par Thomas Lebrun dans le forum C#
    Réponses: 12
    Dernier message: 09/06/2004, 00h04

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