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 :

Problème avec deux fenêtres s'ouvrant à la suite


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2014
    Messages : 5
    Par défaut Problème avec deux fenêtres s'ouvrant à la suite
    Bonjour à tous !
    J'ai commencé python il y a peu de temps et je me lance avec un ami dans mon premier projet : un chat IRC. J'ai un problème avec l'interface : lorsque le client lance le programme, une première fenêtre lui demande de rentrer l'adresse IP du serveur sur lequel se connecter, le port ainsi que le pseudo de connexion. Un bouton permet ensuite en principe de fermer la fenêtre et d'ouvrir la fenêtre de chat. Cependant, au lieu de se fermer complètement, la fenêtre de connexion est incluse dans la seconde (voir image jointe).

    Voici mon 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
    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
    110
    111
    112
    113
    114
    #!/usr/bin/python3
     
    from tkinter import *
    import time
    import socket
    import decimal
     
    class Connection(Frame):
            def valider(self):
                    if (self.ip.get()=="" or self.port.get()=="" or self.pseudo.get()==""):
                            self.erreur["text"] = "Veuillez remplir tous les champs avant de valider"
                    else:
                            global adresse_ip
                            global port_connection
                            global pseudo_user
                            adresse_ip = self.ip.get()
                            port_connection = self.port.get()
                            pseudo_user = self.pseudo.get()
                            Connection.quit(self)
     
            def __init__(self,master=None):
                    Frame.__init__(self, master)
     
                    self.titre1 = Label(text="Adresse IP :")
                    self.titre1.pack(side="top")
     
                    self.ip = StringVar()# Prévoir la variable pour recevoir le texte saisi
                    ip = Entry(textvariable=self.ip, width=30)
                    ip.pack(side="top")
     
     
                    self.titre2 = Label(text="Port :")
                    self.titre2.pack(side="top")
     
                    self.port = StringVar()# Prévoir la variable pour recevoir le texte saisi
                    port = Entry(textvariable=self.port, width=30)
                    port.pack(side="top")
     
                    self.titre3 = Label(text="Pseudo :")
                    self.titre3.pack(side="top")
     
                    self.pseudo = StringVar()# Prévoir la variable pour recevoir le texte saisi
                    pseudo = Entry(textvariable=self.pseudo, width=30)
                    pseudo.pack(side="top")
     
                    self.erreur = Label(text="", fg="red")
                    self.erreur.pack(side="bottom")
     
                    self.validation=Button(text="Valider", command=self.valider)
                    self.validation.pack(side="bottom")
     
    connection = Connection()
    connection.mainloop()
    connection.destroy()
     
    class Chat(Frame):
            global adresse_ip
            global port_connection
            global pseudo_user
            def afficher(e, caca=0):
                    if (e.saisie.get()[0:2]=="/w" and e.saisie.get()!=""):
                            global pseudo_envoi_msg
                            pseudo_envoi_msg=""
                            global message_envoi
                            message_envoi=""
                            for a in range(3, len(e.saisie.get())):
                                    if (e.saisie.get()[a]==" "):
                                            break
                                    pseudo_envoi_msg=pseudo_envoi_msg + e.saisie.get()[a]
                                    message_envoi=e.saisie.get()[(len(pseudo_envoi_msg)+3):]
                    if (e.saisie.get()[0]=="/" and e.saisie.get()[0:2]!="/w"):
                            e.saisie.delete(0, END)
                            return 0
                    if (caca != 0 and e.coched.get() == 0 or e.saisie.get()==""):
                            return 0
                    if (e.saisie.get()[0:2]!="/w"):
                            e.messages.insert(END, time.strftime('[%H:%M]', time.localtime()) + "\t" + "<" + pseudo_user + "> :")
                            e.messages.tag_add("message", float(e.messages.index('end').split('.')[0]) - 3.0,  float(e.messages.index('end').split('.')[0]) - 3.0 + 0.12 + float(len(pseudo_user)/100))
                            e.messages.tag_config("message", foreground="cornflower blue")
                            e.messages.insert(END, "\t" + e.saisie.get() + "\n\n")
                    else:
                            e.messages.insert(END, time.strftime('[%H:%M]', time.localtime()) + "\t" + "à  " + "<" + pseudo_envoi_msg + "> :" + "\t" + message_envoi + "\n\n")
                            e.messages.tag_add("prives", float(e.messages.index('end').split('.')[0]) - 3.0, END)
                            e.messages.tag_config("prives", foreground="green")
                    e.messages.see(END)
                    e.saisie.delete(0, END)# Plus propre que 1000
                    print (float(e.messages.index('end').split('.')[0]) - 3.0)
                    print (float(e.messages.index('end').split('.')[0]) - 3.0 + 0.12 + float(len(pseudo_user)/100))
     
            def __init__(self, master=None):
                    Frame.__init__(self, master)
                    self.saisir = StringVar()# Prévoir la variable pour recevoir le texte saisi
                    self.saisie = Entry(textvariable=self.saisir, width=60)
                    self.saisie.bind("<Return>", self.afficher)
                    self.saisie.pack(side="bottom")
     
                    self.envoi=Button(text="Envoyer", command=self.afficher)
                    self.envoi.pack(side="bottom")
     
                    self.coched = IntVar()# Prévoir la variable pour le résultat de la checkbox
                    self.coche = Checkbutton(variable = self.coched, text="Appuyer sur Entrée pour envoyer", offvalue = 0)
                    self.coche.pack(side="bottom")
                    self.coche.invoke()# On coche automatiquement
     
                    self.scrollbar = Scrollbar()
     
                    self.messages = Text(yscrollcommand=self.scrollbar.set)
                    self.messages.pack(side=LEFT, fill=BOTH)
     
                    self.scrollbar.pack(side=RIGHT, fill=Y)
                    self.scrollbar.config(command=self.messages.yview)
     
    win = Chat()
    win.mainloop()
    Je n'ai rien retiré du code n'ayant aucune idée d'où peut venir l'erreur, ce n'est encore que le début du projet il y a donc évidemment beaucoup d'autres erreurs ou de choses incomplètes mais celle-là me pose vraiment problème . Merci !
    Images attachées Images attachées  

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    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 754
    Par défaut
    Salut,

    En fait connexion.destroy "fonctionne".
    Le soucis est que les widgets déclares dans l'__init__ ne sont pas "fils" de cette Frame la mais de l'instance de l'application.

    Pour des détruire dans la foulée, il faut préciser leur master.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            def __init__(self,master=None):
                    Frame.__init__(self, master)
     
                    self.titre1 = Label(self, text="Adresse IP :")
                    ...
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2014
    Messages : 5
    Par défaut
    Ce serait donc quelque chose 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
    45
    46
    47
    class Connection(Frame):
            def valider(self):
                    if (self.ip.get()=="" or self.port.get()=="" or self.pseudo.get()==""):
                            self.erreur["text"] = "Veuillez remplir tous les champs avant de valider"
                    else:
                            global adresse_ip
                            global port_connection
                            global pseudo_user
                            adresse_ip = self.ip.get()
                            port_connection = self.port.get()
                            pseudo_user = self.pseudo.get()
                            Connection.quit(self)
     
            def __init__(self,master=None):
                    Frame.__init__(self, master)
     
                    self.titre1 = Label(self, text="Adresse IP :")
                    self.titre1.pack(side="top")
     
                    self.ip = StringVar()# Prévoir la variable pour recevoir le texte saisi
                    self.ip = Entry(self, textvariable=self.ip, width=30)
                    self.ip.pack(side="top")
     
     
                    self.titre2 = Label(self, text="Port :")
                    self.titre2.pack(side="top")
     
                    self.port = StringVar()# Prévoir la variable pour recevoir le texte saisi
                    self.port = Entry(self, textvariable=self.port, width=30)
                    self.port.pack(side="top")
     
                    self.titre3 = Label(self, text="Pseudo :")
                    self.titre3.pack(side="top")
     
                    self.pseudo = StringVar()# Prévoir la variable pour recevoir le texte saisi
                    self.pseudo = Entry(self, textvariable=self.pseudo, width=30)
                    self.pseudo.pack(side="top")
     
                    self.erreur = Label(self, text="", fg="red")
                    self.erreur.pack(side="bottom")
     
                    self.validation=Button(self, text="Valider", command=self.valider)
                    self.validation.pack(side="bottom")
     
    connection = Connection()
    connection.mainloop()
    connection.destroy()
    Lorsque je fais ça il n'y a carrément plus rien qui s'affiche dans la fenêtre de connection^^ c'est sans doute tout bête mais j'ai encore un peu de mal à comprendre les ficelles de Tkinter :/

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    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 754
    Par défaut
    Citation Envoyé par Eloi Zalczer Voir le message
    Ce serait donc quelque chose comme ça.
    Lorsque je fais ça il n'y a carrément plus rien qui s'affiche dans la fenêtre de connection^^ ?
    Cela va faire marcher le .destroy (sauf peut etre pour les xxxVar).
    Maintenant que les widgets sont dans Frame, "plus rien ne s'affiche" car il manquait un frame.pack() des le départ.

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

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2014
    Messages : 5
    Par défaut
    Merci beaucoup wiztricks !! Ça marche parfaitement !

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

Discussions similaires

  1. [MySQL] problème avec deux requetes dans un même script
    Par leclone dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/02/2007, 10h28
  2. [CSS] Problème avec deux div côte-à-côte
    Par Etanne dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 31/07/2006, 13h58
  3. Problème avec deux interfaces
    Par ikeaboy dans le forum Langage
    Réponses: 2
    Dernier message: 28/05/2006, 14h56
  4. [Javascript] Problème avec une fenêtre popup.
    Par mika0102 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 18/05/2005, 10h50
  5. Réponses: 22
    Dernier message: 29/01/2005, 11h29

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