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 :

Insérer un cadre pour regrouper des widgets


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut Insérer un cadre pour regrouper des widgets
    Bonjour tout le monde,

    J'utilise Python 2.6 avec Wing IDE personnal.

    Je dois créer une interface graphique qui ressemblera à celle-ci :



    J'aimerais créer un cadre qui regrouperait différents widgets.

    C'est plus "esthétique" que fonctionnel (je pense).

    J'ai tenté ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.separator = Frame(height=2, bd=1, relief=SUNKEN)
    self.separator.pack(fill=X, padx=5, pady=5)
    Sans succès.

    Quand je lance l'application, le form ne s'affiche pas.

    Je me demandais donc comment afficher plusieurs widgets dans un frame et y mettre un titre à ce widget (sur l'image c'est "Experiment")


    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
    from Tkinter import *
     
    class Simple_app_tk(Tk):
        def __init__(self, parent):
            Tk.__init__(self, parent)
            self.parent=parent
        def initialize(self):
            self.grid
            self.labelMicro = Label(self.parent, text="MIC 1", font=("Helvetica", 20)) #attention : text est une propriété de Label mais Text (grand T) est une classe
            self.labelMicro.grid(column=0, row=0, sticky='EW') #placement d'une zone de texte à la colonne 0 et à la ligne 0
     
     
            self.separator = Frame(height=2, bd=1, relief=SUNKEN)
            self.separator.pack(fill=X, padx=5, pady=5)
     
     
     
     
    if __name__=="__main__":
        app=Simple_app_tk(None)
        app.title('Ma fenetre')
        app.initialize()
        app.mainloop()
    Tant qu'on y est, savez-vous comment s'appelle le widget avec les deux flèches et la valeur numérique ? (delay(s)) ?

    Merci d'avance pour votre aide.

    beegees

  2. #2
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 70
    Par défaut
    bon pour commencer il faut éviter de mélanger les .pack() avec les .grid() ou les .place() sinon sa ne s'affiche pas

    aussi quand tu écrit : au début de la class la fenetre qui va s'afficher sera vide. il faut donc l'écrire en derniere ligne et aussi il ne faut pas oublier les "()" ^^

    sinon je croit que j'ai compris ce que tu voulais faire alors j'ai fais un petit exemple rapidement

    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
     
    import Tkinter
     
    class panneau2(Tkinter.Frame):
        def __init__(self, parent):
            Tkinter.Frame.__init__(self, borderwidth = 5, padx = 5, pady = 5, relief = Tkinter.SUNKEN)
     
            # ajout des bouttons de test
            Tkinter.Button(self, text = "boutton1").grid(row = 1, column = 1)
            Tkinter.Button(self, text = "boutton1").grid(row = 2, column = 1)
            Tkinter.Button(self, text = "boutton3").grid(row = 3, column = 1)
            self.grid()
     
    class panneau1(Tkinter.Frame):
        def __init__(self, parent):
            Tkinter.Frame.__init__(self, borderwidth = 5, padx = 5, pady = 5, relief = Tkinter.GROOVE)
     
            # ajout des label de test 
            Tkinter.Label(self, text = " boutton 1 ==> ", font = "{MS Sans Serif} 12").grid(row = 1, column = 1)
            Tkinter.Label(self, text = " boutton 2 ==> ", font = "{MS Sans Serif} 12").grid(row = 2, column = 1)
            Tkinter.Label(self, text = " boutton 3 ==> ", font = "{MS Sans Serif} 12").grid(row = 3, column = 1)
            self.grid()
     
    class interface1(Tkinter.Frame):
        def __init__(self):
            Tkinter.Frame.__init__(self)
     
            # ajout du premier panneau
            self.panneauNumero1 = panneau1(self)
            self.panneauNumero1.grid(row = 2, column = 1)
     
            # ajout du second panneau
            self.panneauNumero2 = panneau2(self)
            self.panneauNumero2.grid(row = 2, column = 2)
     
            self.grid()
     
    if __name__=='__main__':
        App_Interface = interface1()
        App_Interface.mainloop()
    voila en espérant avoir répondut a t'est question.

  3. #3
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut
    Salut,

    Un super grand merci pour ta réponse et tes conseils.

    bon pour commencer il faut éviter de mélanger les .pack() avec les .grid() ou les .place() sinon sa ne s'affiche pas.
    OK, j'en prends note, désolé mais je suis débutant.

    aussi quand tu écrit : au début de la class la fenetre qui va s'afficher sera vide. il faut donc l'écrire en derniere ligne et aussi il ne faut pas oublier les "()" ^^
    OK, merci pour l'info.

    sinon je croit que j'ai compris ce que tu voulais faire alors j'ai fais un petit exemple rapidement
    Merci pour l'exemple, il va beaucoup me servir, je vais m'en inspirer pour faire le reste de mon formulaire.

    Quelques questions sur ton code :

    1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if __name__=='__main__':
        App_Interface = interface1()
    On crée donc un objet nommé App_Interface de type interface1

    Ce que je ne comprends pas, c'est qu'arrivé dans la class interface1, la classe prend un paramètre Tkinter.Frame.

    On ne doit pas normalement envoyer le paramètre en créant l'objet ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    App_Interface = interface1()
    2

    J'ai modifié un de tes widget afin d'utiliser un widget de type "Entry" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Tkinter.Entry(self, text = " 240 ", font = "{MS Sans Serif} 12").grid(row = 2, column = 2)
    J'obtiens bien une zone de texte mais j'aimerais aussi avoir une valeur par défaut.

    Je pensais que text = " 240 " m'aurait permis d'obtenir ce résultat mais sans succès.

    3

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Tkinter.Button(self, text = "boutton1").grid(row = 3, column = 1)
    Tkinter.Button(self, text = "boutton1").grid(row = 4, column = 1)
    Tkinter.Button(self, text = "boutton3").grid(row = 5, column = 1)
    Ces boutons apparaissent à droite de ma première frame mais j'aurais voulu qu'ils apparaissent en dessous du premier frame, comment faire stp ?

    4

    Comment mettre un titre au frame ?

    beegees

  4. #4
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 70
    Par défaut
    1

    j'ai pas compris

    2
    pour commencer, si tu veut intérargir avec tes widgets dans la suite de t'on programme il faut que tu les enregistre dans des variables.

    pour mettre un text dans un Entry ou dans un Text, il faut utiliser la fonction insert

    donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    self.entry = Tkinter.Entry(self, width = 20, font = "{MS Sans Serif} 10")
    self.entry.insert(Tkinter.END, "240")
    self.entry.grid( ... )
    3

    pour faire un bon positionnement de tes objets dans ton interface, il faut que voit ta fenetre comme une grille. a chaque croissement de ligne/colone tu peut mettre un objet. donc il faut que au minimum tu renseigne le numero de la ligne et le numero de la colone pour positionner ton objets

    les bouttons sont "fabriquer" dans la class panneau2. donc pour les afficher dans t'on interface tu appele cette class et tu la grid au bon endroit

    ici, pour la placer sous les Label il faut mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # ajout du second panneau
            self.panneauNumero2 = panneau2(self)
            self.panneauNumero2.grid(row = 3, column = 1)
    4

    pour ajouter un titre a ta fenetre, il te faut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class interface1(Tkinter.Frame):
        def __init__(self):
            Tkinter.Frame.__init__(self)
            self.master.title(" mon titre :)")          # <-- normalement 
    
            # ajout du premier panneau


    voila. j'espere avoir correctement répondut. et je suis content de t'avoir aider

Discussions similaires

  1. Algorithme pour regrouper des nombres (combinaisons ?)
    Par Fabricer66 dans le forum Intelligence artificielle
    Réponses: 10
    Dernier message: 12/06/2009, 13h37
  2. [Toutes versions] problème pour regrouper des valeurs de cellules tout en respectant l'ordre
    Par songs_of_liberty dans le forum Excel
    Réponses: 5
    Dernier message: 16/04/2009, 18h43
  3. Réponses: 4
    Dernier message: 19/10/2008, 20h07
  4. [Macro] macro pour regrouper des tables
    Par melomanu dans le forum Macro
    Réponses: 5
    Dernier message: 16/10/2008, 17h05
  5. Utilisation de Regex pour regrouper des emails
    Par NicoNGRI dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 18/02/2008, 16h51

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