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 :

Interface Tkinter python


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2017
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Interface Tkinter python
    Bonjour à tous,

    Je débute avec l'interface tkinter python et je rencontre un souci d'algo dans l'écriture de mon code; j'explique :

    1- L'interface principale de mon application hérite d'une classe "local_connexion" qui, elle hérite déja de Tkinter (voir code ci-après)
    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
    class Interface(local_connexion):  #interface principale
        def __init__(self):
            locale_connexion.__init__(self)
            self.geometry('410x445');  self.title('Gestionnaire de connexions clients')  # geom de l'obj interface
            self['bg'] = 'light blue'
            self.menu = Menu(self)
            self.sousmenu2 = Menu(self.menu, activebackground='grey', tearoff=0)
            self.menu.add_cascade(label='Connexion', state=ACTIVE, menu=self.sousmenu2) # menu connexion
                       ###############  sous menu 2 ##############
           self.sousmenu2.add_command(label='Connexion locale',command=self.CL)  #func* connexion local commandé par func* CL hérité de class local_connexion
    
    class local_connexion(Tk):# interface de connexion
        def __init__(self):
            Tk.__init__(self)
        def TEST_CL(self): # func* test de connexion
            user = self.var_user.get(); self.password = var_password.get()
            host = self.var_host.get(); self.port = var_port.get(); self.bdd = var_bdd.get()
            db ='pq://%s:%s@%s:%s/%s' %(user, password, host, port, bdd)
            try:
                conn = postgresql.open(db); showinfo ('Infos connnexion', 'Connexion réussie')
            except Exception:
                print (db); print ('echec de connexion')
                showerror("Infos connnexion", 'Echec de connexion! Veuillez vérifier les paramètres')
        def CL(self):  # fonction d'appel fenetre TK pour renseigner les infos de connexions 
            self.geometry('315x320'); self.title('Connexion locale au serveur'); self['bg'] = 'light blue'
            self.label_frame = Label(self, text= "Saisissez les paramètres de connexion", fg='black', bg='light blue').place(x=1, y=15)
            label_username = Label(self, text="Nom d'utilisateur :", fg='black', bg='light blue').place(x=10, y=55)
            ligne_user = Entry(self, textvariable=self.var_user, width =26).place(x=130, y=55)
            label_password = Label(self, text="Mot de passe :", fg='black', bg='light blue').place(x=10, y=100)
            ligne_password = Entry(self, textvariable=self.var_password, width =26).place(x=130, y=100)
            label_host = Label(self, text="Hôte :", fg='black', bg='light blue').place(x=10, y=145)
            ligne_host = Entry(self, textvariable=self.var_host, width =26).place(x=130, y=145)
            label_port = Label(self, text="Port :", fg='black', bg='light blue').place(x=10, y=190)
            ligne_port = Entry(self, textvariable=self.var_port, width =26).place(x=130, y=190)
            label_bdd = Label(self, text="Base de donnée :", fg='black', bg='light blue').place(x=10, y=235)
            ligne_bdd = Entry(self, textvariable=self.var_bdd, width =26).place(x=130, y=235)
            cl_ok = Button(self, text="Tester", width=6, command=self.TEST_CL).place(x=178, y=280) #self.ok_cl command
            cl_annuler = Button(self, text="Annuler", width=6, command=quit).place(x=238, y=280)
            self.mainloop()
        #fin de class
    Mes questions:
    L'héritage de classe fait qu'à l'appel de la fonction CL, la classe interface appelle non une nouvelle fenêtre Tk pour recueillir les infos de connexions (comme le veut la fonction CL) mais écrase plutôt la fenêtre de l'Interface principale au profit de celle de la func* CL (ce qui est logique).

    Comment écrire l'algo dans ce cas pour que le code puisse permettre de générer une nouvelle fenêtre indépendante de celle de l'interface principale?? (sachant que j'y suis parvenu de plusieurs façons [en definissant notamment dans la func* CL une nouvelle fenêtre mais la methode get() ne marche pas], [en definissant la func* CL comme une méthode d'instance, pareil l'appel de la commande ne reconnait pas cls.CL] ???

    Merci beaucoup d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 778
    Points
    36 778
    Par défaut
    Salut,

    Citation Envoyé par mcnass Voir le message
    Comment écrire l'algo dans ce cas pour que le code puisse permettre de générer une nouvelle fenêtre indépendante de celle de l'interface principale?? (sachant que j'y suis parvenu de plusieurs façons [en definissant notamment dans la func* CL une nouvelle fenêtre mais la methode get() ne marche pas], [en definissant la func* CL comme une méthode d'instance, pareil l'appel de la commande ne reconnait pas cls.CL] ???
    Une fenêtre secondaire se crée via Toplevel.
    Avec une classe qui hérite de Tk et une autre qui en héritera indirectement, fabriquer une instance de chaque classe induira la création de deux instances de "fenêtre principale" (qui est beaucoup plus qu'une simple fenêtre et qui fout la grouille si vous ne savez pas le gérer).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2017
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Bonjour, et merci

    Yes, en fouillant un peu j'ai vu que l'objet Toplevel permettait d'ouvrir une fenêtre indépendant de celle de Tkinter.

    Cependant, le bug persiste toujours (voici l'exemple d'un test effectué sur les deux objets Tkinter et Toplevel) :

    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
    from tkinter import*
    class CL:                              #notre class toplevel
        resultat = []
        def Cl (self):
            cl = Toplevel ()
            Label(cl, text= "Saisissez les paramètres de connexion").pack()
            var1 = StringVar()
            var2 = StringVar()
            saisie1 = Entry(cl, textvar=var1)
            saisie2 = Entry(cl, textvar=var2)
            saisie1.pack()
            saisie2.pack()
            Button(cl, text="Tester", command=CL().TestCl).pack() #l'appel a la func* d'instance Test_Cl ne permet pas d'avoir les valeurs de la liste CL.resultat 
            cl.mainloop()                                                          
            CL.resultat.append ( saisie1.get () )  #l'ajout des valeurs à la liste n'est possible qu'après la boucle de l'obj, ce qui empêche d'avoir le résultat escompté
            CL.resultat.append ( saisie2.get () )  # definir CL.resultat.append ( saisie1.get () )avant le button et la boucle ne permet pas de get() la saisie en liste
            cl.destroy()
     
        def Test_Cl(self):
            user = CL().Cl.saisie1
            #user = CL.resultat[1]
            print(user)
     
    root = Tk()
    a = Button (text= "Connexion", command = CL().Cl).pack()
    b = Button (text= "afficher", command = CL().Test_Cl).pack()
    root.mainloop()
    C'est pas simple

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 778
    Points
    36 778
    Par défaut
    Salut,

    Votre code plante direct car ligne13 vous avez omis '_'.
    Expliquez moi pourquoi ce que vous avez écrit à la ligne 20: CL().Cl.saisie1 devrait fonctionner...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2017
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    pour la ligne 13 vous avez raison. Mais cela doit être une erreur de frappe d'autant plus que la fonction d'instance est bel et bien 'Test_Cl' et cela marchait bien

    pour la ligne 20 , disons que mon incapacité face à cette situation m'a fait repensé la syntaxe.

    Plus sérieusement, ceci est le bon code :

    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
     
    from tkinter import*
     
    class CL:
        resultat = []
        def Cl (self):
            cl = Toplevel ()
            Label(cl, text= "Saisissez les paramètres de connexion").pack()
            saisie1 = Entry(cl)
            saisie1.pack()
            saisie2 = Entry(cl)
            saisie2.pack()
            Button(cl, text="Tester", command=cl.quit).pack() #self.ok_cl command
            cl.mainloop()
            CL.resultat.append ( saisie1.get () )
            CL.resultat.append ( saisie2.get () )
            cl.destroy()
        def Test_Cl(self):
            user = CL.resultat[1]
            print(user)
     
    root = Tk()
    a = Button (text= "Connexion", command = CL().Cl).pack()
    b = Button (text= "afficher", command = CL().Test_Cl).pack()
    root.mainloop()
    Mais je souhaiterais pour la fonctionnalité que je recherche, qu'on puisse appeler la fonction Test_Cl sur le bouton "tester", ce qui me permettrait d'ordonner une instruction avec les valeurs insérées avec la méthode Entry; (un peu du style LOGGIN, VALIDER!).

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 778
    Points
    36 778
    Par défaut
    Salut,

    Vous pourriez écrire: command=self.Test_Cl et faire .append et .destroy dans cette méthode là.
    Mais... vu comment vous utilisez vos classes, çà serait bien de réviser un peu la POO avec Python (ou d'éviter de l'utiliser n'importe comment tant que vous n'en avez pas plus besoin que çà).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2017
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Merci!

    En effet cela est bel et bien possible tout simplement si l'on définie les variables saisie1 et saisie2 comme variable global, i.e dont on peut avoir accès à l'intérieur comme à l'extérieur de la fonction CL (j'y avais pensé).

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 778
    Points
    36 778
    Par défaut
    Salut,

    Vous avez ici exemples et documentation pour la construction de boîtes de dialogues. Çà explique comment çà fonctionne et l'utiliser. Les classes de bases (SimpleDialog et Dialog) sont dans le module tkinter simpledialog.py.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Interface et Python
    Par dahtah dans le forum Général Python
    Réponses: 9
    Dernier message: 27/10/2007, 18h18
  2. interface en python
    Par elekis dans le forum Général Python
    Réponses: 8
    Dernier message: 12/09/2007, 16h21
  3. Interface graphique python ds eclipse
    Par Terminator dans le forum GUI
    Réponses: 6
    Dernier message: 23/04/2007, 09h54
  4. [matplotlib] Croubes dans une interface tkinter
    Par vinzzzz dans le forum Tkinter
    Réponses: 2
    Dernier message: 08/12/2006, 14h34
  5. [Tkinter] Python sous Linux
    Par PMdomine dans le forum Tkinter
    Réponses: 7
    Dernier message: 06/03/2006, 20h56

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