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 :

Creer plusieurs fenetres


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Par défaut Creer plusieurs fenetres
    Bonjour à tous,

    Je debute en Tkinter et j'ai quelques questions. Je cherche a debugger un jeu en reseau en local, en créant plusieurs clients sur ma machine. L'interface était faite en Pygame, qui interdit d'utiliser plusieurs fenêtres, c'est pourquoi je cherche à migrer en Tkinter.

    Je cherche donc à créer plusieurs fenêtres qui soient toutes identiques (du moins pour le code client, qui consiste essentiellement à afficher/déplacer des images). En gros je veux que chaque client instancie sa fenêtre, et que ces fenêtres soient identiques.

    1/ quelle est la meilleure manière de faire ceci ?

    2/ Lequel de ces deux codes semble le plus adapté ? Les classes Tk et Toplevel ont- elles la même interface en ce qui concerne le dessin ?
    code 1
    from Tkinter import *
    root = Tk()
    r2 = Toplevel(root)
    code 2
    from Tkinter import *
    root = Tk()
    r2 = Tk()

    3/ Pour ces deux codes, les boucles d'événements sont elles distinctes entre mes deux instances de Tk, ou mélangées ?

    Merci d'avance

  2. #2
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Par l'exemple avec Photoimage (choix volontaire puisque tu parle d'image)
    Dans le premier cas le Toplevel est trop dépendant de l'instance Tk.
    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
    # Sur le code 1
    import Tkinter
     
    root = Tkinter.Tk()
     
    img1 = Tkinter.PhotoImage(file='ZB.gif')
    img2 = Tkinter.PhotoImage(file='ZR.gif')
     
    canv = Tkinter.Canvas(root, width=100, height=100)
    canv.pack()
    canv.create_image(50, 50, image=img1)
     
    r2=Tkinter.Toplevel(root)
    Tkinter.Label(r2, image=img2).pack()
     
    Tkinter.Button(root, text="Quitter", command=root.destroy).pack()
    # A toi de cliquer sur le Button et voir se qui se passe.
    # Pas très 'indépendant' tout cela (Toplevel(root))
     
    root.mainloop()
    Si tu le souhaite utilise Toplevel pour tes clients a la limite il est possible d'utiliser la class 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
    import Tkinter
     
    class unclient(Tkinter.Toplevel):
        def __init__(self):
            Tkinter.Toplevel.__init__(self)
            Tkinter.Label(self, image=img2).pack()
            Tkinter.Button(self, text="Quitter", command=self.destroy).pack()
     
    root = Tkinter.Tk()
     
    img1 = Tkinter.PhotoImage(file='ZB.gif')
    img2 = Tkinter.PhotoImage(file='ZR.gif')
     
    canv = Tkinter.Canvas(root, width=100, height=100)
    canv.pack()
    canv.create_image(50, 50, image=img1)
     
    r2=unclient()
    r3=unclient()
    # Ce n'est pas les mêmes toplevels
    print id(r2)
    print id(r3)
     
    Tkinter.Button(root, text="Quitter", command=root.destroy).pack()
     
    root.mainloop()
    Dans le deuxième c'est impossible.
    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
    # Sur le code 2
    import Tkinter
     
    root = Tkinter.Tk()
    r2 = Tkinter.Tk()
     
    img1 = Tkinter.PhotoImage(file='ZB.gif')
    canv = Tkinter.Canvas(root, width=100, height=100)
    canv.pack()
    canv.create_image(50, 50, image=img1)
     
    img2 = Tkinter.PhotoImage(file='ZR.gif')
    Tkinter.Label(r2, image=img2).pack()
     
    Tkinter.Button(root, text="Quitter", command=root.destroy).pack()
     
    root.mainloop()
    # 1 Je mets le r2.mainloop ou ?
    # 2 Avec deux instance Tk Photoimage ne si retrouve pas et retourne _tkinter.TclError: image "pyimage2" doesn't exist
    #   Cela ne fonctionne pas.
    Dans tous les cas Tkinter ne supporte qu'une instance Tk().
    Puisque tu souhaite avoir plusieurs clients pourquoi ne pas lancer le script client plusieurs fois.

    Bon code.

  3. #3
    Membre Expert
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Par défaut Encore un détail
    Merci PauseKawa,

    En ce qui concerne le second code, je comptais naivement faire partir root.mainloop() et r2.mainloop() dans des threads séparés^^

    Si je demarre deux fois le script client comme tu le suggères, et que chaque script instancie un Tk() (puisque les scripts sont a priori identiques), est ce que cela fonctionnera (pas d'erreur _tkinter.TclError: image "pyimage2" doesn't exist
    ) ?

    Bonne journée

  4. #4
    Membre chevronné
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut
    Bonjour :-) ,

    Je confirme qu'il ne faut pas utiliser plusieurs instances de Tk dans un même script.

    Après Tkinter n'est pas threads safe donc si l'on ne peut pas créer de thread au sein d'une même application Tk je ne sais pas de ce qu'il en est pour un script comme celui-ci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Mon_app( Tk ) :
        # ma fenetre
     
    def star_client( ) :
        a = Mon_app()
        a.mainloop()
     
    thread1 = threading.Thread( target = star_client )
    thread2 = threading.Thread( target = star_client )
     
    thread1.start()
    thread2.start()
    Je déconseille.

    Si je demarre deux fois le script client comme tu le suggères, et que chaque script instancie un Tk() (puisque les scripts sont a priori identiques), est ce que cela fonctionnera (pas d'erreur _tkinter.TclError: image "pyimage2" doesn't exist
    ) ?
    Oui a condition que ton serveur gère les connexions multiples .
    Cela ne pose aucun problème pour Tk, c'est même de cette manière qu'il faut faire.
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 252
    Par défaut
    Bonjour
    est-ce que wxPython peut lui marcher avec des threads?

  6. #6
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonsoir,

    Citation Envoyé par vincent.mbg Voir le message
    Si je demarre deux fois le script client comme tu le suggères, et que chaque script instancie un Tk() (puisque les scripts sont a priori identiques), est ce que cela fonctionnera (pas d'erreur _tkinter.TclError: image "pyimage2" doesn't exist
    ) ?
    Oui a condition que ton serveur gère les connexions multiples .
    Cela ne pose aucun problème pour Tk, c'est même de cette manière qu'il faut faire.
    C'est même de cette manière qu'il faut faire dans tous les cas.

    Bon code.

  7. #7
    Membre Expert
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Par défaut
    Merci pour vos réponses.

    J'ai finalement réalisé que pour la même raison, je pouvais exécuter les fenêtres Pygame dans deux process sans clash. Donc plus besoin pour moi de migrer en Tkinter: Youpi ;-)

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

Discussions similaires

  1. Creer une fenetre avec plusieurs pages
    Par beni34 dans le forum Visual Studio
    Réponses: 1
    Dernier message: 30/07/2009, 18h56
  2. ouvrir plusieurs fenetre avec un lien
    Par demanghonj dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 21/10/2004, 10h35
  3. Réponses: 2
    Dernier message: 09/10/2004, 11h35
  4. creer une fenetre personnalisee
    Par lutin511 dans le forum Windows
    Réponses: 3
    Dernier message: 26/05/2004, 13h46
  5. Réponses: 8
    Dernier message: 17/03/2004, 14h40

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