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 :

Boite de dialogue


Sujet :

Tkinter Python

  1. #1
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Points : 891
    Points
    891
    Par défaut Boite de dialogue
    bonsoir
    voici le code d'une boite de dialogue qui doit normalement me retourner le nom du champs entry.
    Mais quand je l'utilise dans un programme global, du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    new_canal=Nom_Fichier(titre='Nom du Canal',
                message='Veulliez saisir le nom du nouveau canal')
            filename=new_canal+'.cfg'
    j'ai un retour erreur :
    Error: 1
    TypeError Exception in Tk callback
    Function: <bound method Foto2Pack.new_canal of <__main__.Foto2Pack instance at 0x00AF4198>> (type: <type 'instancemethod'>)
    Args: ()
    Traceback (innermost last):
    File "C:\Python24\lib\site-packages\Pmw\Pmw_1_2\lib\PmwBase.py", line 1747, in __call__
    return apply(self.func, args)
    File "C:\Documents and Settings\Benoit\Mes documents\Programmation\serv4pack_2\Gui_serv.py", line 696, in new_canal
    filename=new_canal+'.cfg'
    TypeError: unsupported operand type(s) for +: 'instance' and 'str'
    je n'arrive pas a cerner le problème.
    voici ma class :
    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
    class Nom_Fichier:
     
        """ Boite de dialogue pouvant servir a récupérer un nom 
        entré par l'utilisateur.Vérifie la condition de champs nom nul avant de
        retourner la valeur au pro
    gramme """
     
        def __init__(self,titre='titre',message='message'):
            gui=tk.Toplevel()
            gui.title(titre)
     
            tk.Label(gui,text=message,fg='blue',bg='white').grid(
                row=0,columnspan=2,sticky=tk.E+tk.W)
     
            self.entry=tk.Entry(gui,width=50)
            self.entry.grid(row=1,columnspan=2,padx=2,pady=5)
     
            tk.Button(gui,text='Valider',command=lambda guy=gui: self.valid(gui)).grid(row=2,column=0,
                sticky=tk.W+tk.E,padx=2,pady=5)
            tk.Button(gui,text='Annuler',command=gui.destroy).grid(row=2,column=1,
                sticky=tk.W+tk.E,padx=2,pady=5)
     
     
        def valid(self,guy):
            entry=self.entry.get()
            self.entry.delete(0,tk.END)
            if entry == '':
                tkMessageBox.showerror('ERREUR',
                'Entrez un nom valide, merci.\nUn nom différent de rien!')
            else:
                guy.destroy()
                return entry
    Si quelqu'un pouvait m'eclairer ca serait cool.
    merci

    Edité par Guigui-: pense à utiliser des triples double-quote pour tes docstrings (ou bien évite qu'il y ait des apostrophes dedans parce que la coloration syntaxique ne le gère pas pour le moment. Merci

  2. #2
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    new_canal n'a pas l'air d'être un string

    ce serait-pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    new_canal=Nom_Fichier(titre='Nom du Canal',
                message='Veulliez saisir le nom du nouveau canal')
            filename=self.entry.get()+'.cfg'

  3. #3
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Points : 891
    Points
    891
    Par défaut
    Merci guigui, mais ce n'est pas ca.
    Je n'est pas acces a mon entry, puisque c'est une variable de ma classe Nom_Fichier.

    J'aimerai avoir le même principe de fonctionnement que les tkFileDialog.
    genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nom_du_fichier=tkFileDialog.askopenfilename()
    là, je récupère bien une string en retour.

    Pourquoi pas dans ma classe Nom_fichier.

  4. #4
    Membre averti
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Points : 388
    Points
    388
    Par défaut
    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
     
    import Tkinter as tk
    import tkMessageBox
     
    class nom_fichier(tk.Toplevel):
        def __init__(self, parent,titre='titre',message='message'):
            tk.Toplevel.__init__(self, parent)
            self.title=titre
            self.entry=tk.Entry(self,width=50)
            self.entry.grid(row=1,columnspan=2,padx=2,pady=5)
             tk.Button(self,text='Valider',command=self.valider).grid(row=2,column=0,
                sticky=tk.W+tk.E,padx=2,pady=5)
            tk.Button(self,text='Annuler',command=self.destroy).grid(row=2,column=1,
                sticky=tk.W+tk.E,padx=2,pady=5)
            self.wait_window(self)
        def valider(self):
            if not self.valid():
                return
            self.sortie()
            self.destroy()
        def valid(self):
            self.filename=self.entry.get()
            self.entry.delete(0,tk.END)
            if self.filename == '':
                tkMessageBox.showerror('ERREUR',
                'Entrez un nom valide, merci.\nUn nom différent de rien!')
            else:
                return 1
        def sortie(self):
            return self.filename
     
    if __name__=='__main__':
        root=tk.Tk()
        new_canal=nom_fichier(root,titre='Nom du Canal',
                message='Veulliez saisir le nom du nouveau canal')
        filename=new_canal.sortie()+'.cfg'
        print filename
        root.mainloop()
    Il faudrait lui donner le focus et gérer les évènements.

  5. #5
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Points : 891
    Points
    891
    Par défaut
    merci, pour le bout de code.

    Je vais certainement l'utiliser.
    Si je peux me permettre une petite suggestion, pourriez vous commenter le code, ca permet de bien comprendre et pouvoir apprendre plutot que de pomper betement.
    En tout cas grand merci pour l'aide.

    a bientot

  6. #6
    Membre averti
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Points : 388
    Points
    388
    Par défaut
    Bonjour,
    Le plus important ici, c'est la méthode wait_window qui fait que root attend la fermeture du toplevel pour continuer.
    On pourrait faire aussi comme ça :

    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
    import Tkinter as tk
    import tkMessageBox
     
    class nom_fichier(tk.Toplevel):
        def __init__(self, parent,titre='titre',message='message'):
            tk.Toplevel.__init__(self, parent)
            self.title=titre
            self.transient(parent)  #pour n'avoir qu'une icone dans la barre des tâches
            self.grab_set() #L'utilisateur n'a plus accès à la fenetre parente
            tk.Label(self,text=message,fg='blue',bg='white').grid(
                row=0,columnspan=2,sticky=tk.E+tk.W)
            self.entry=tk.Entry(self,width=50)
            self.entry.grid(row=1,columnspan=2,padx=2,pady=5)
            tk.Button(self,text='Valider',command=self.valider).grid(row=2,column=0,
                sticky=tk.W+tk.E,padx=2,pady=5)
            tk.Button(self,text='Annuler',command=self.destroy).grid(row=2,column=1,
                sticky=tk.W+tk.E,padx=2,pady=5)
            self.bind('<Return>',self.valider)
            self.bind('<Escape>',self.quitter)
            self.filename=''
        def valider(self,event=None):
            if not self.valid():
                return
            self.sortie()
            self.destroy()
        def valid(self):
            self.filename=self.entry.get()
            self.entry.delete(0,tk.END)
            if self.filename == '':
                tkMessageBox.showerror('ERREUR',
                'Entrez un nom valide, merci.\nUn nom différent de rien!')
            else:
                return 1
        def sortie(self):
            return self.filename
        def quitter(self,event=None):
            self.destroy()
    if __name__=='__main__':
        root=tk.Tk()
        new_canal=nom_fichier(root,titre='Nom du Canal',
                message='Veulliez saisir le nom du nouveau canal')
        root.wait_window(new_canal) #Attends que new_canal soit fermé (plus logique ici ?)
        filename=new_canal.sortie()+'.cfg'
        print filename

Discussions similaires

  1. Pb plusieurs boites de dialogues
    Par schnito dans le forum MFC
    Réponses: 10
    Dernier message: 25/02/2004, 21h44
  2. [MFC] rendre une boite de dialogue inactive
    Par Vestaproman dans le forum MFC
    Réponses: 8
    Dernier message: 22/01/2004, 14h09
  3. Affichage d'une boite de dialogue nonmodale avec MFC
    Par the.cable.guy dans le forum Windows
    Réponses: 3
    Dernier message: 04/07/2003, 17h59
  4. Réponses: 5
    Dernier message: 04/04/2003, 15h02
  5. Comment cree une boite de dialogue parcourir
    Par kenshi dans le forum MFC
    Réponses: 5
    Dernier message: 06/01/2003, 10h30

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