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 :

Scrollbar de Text placé par méthode .place


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 103
    Par défaut Scrollbar de Text placé par méthode .place
    Développeuses, Développeurs, Bonsoir !

    Mes Widgets sont positionnés par .place
    Je souhaite ajouter un Scrollbar à un widget Text.
    Dans la doc je ne trouve que des Scrollbar positionnés par .grid.
    J'ai testé le mélange de .place et .grid , semble ne pas marcher.

    Comment faire ?
    J' aimerais éviter de tout passer en .grid.
    Y a t-il une solution simple ?

    Merci pour tout conseil !

    Voici le 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
     
    #--- user variable ---
    usingIDLE = 0                    #set = 1 if running from IDLE, otherwise 0
     
    #--- modules ---
    import tkMessageBox, tkSimpleDialog, tkFileDialog, string
    import os.path, glob, sys
    import Tkinter as tk
    # import ScrolledText
    # from Tkconstants import LEFT, RIGHT, TOP, BOTTOM, END, Y
     
     
     
    #--- classes ---
    class uiClass:
     
        def __init__ (self,master,ar,xy,flex):
     
            # create the main GUI window with its menu object
            self.frame = tk.Toplevel    (relief='ridge', borderwidth=2)
     
            # sets its size and location
            self.frame.geometry (ar+xy)
            # (dis)allow resize horiz/vertical
            self.frame.resizable    (flex,flex)
     
            # widgets
            btn_exp = tk.Button     (self.frame,
                                    text = 'Expediteur',
                                    width=20, bd=4,
                                    command = self.lance_exp)
            btn_exp.place (x=30, y=20)
     
            btn_date = tk.Button    (self.frame,
                                    text='date',
                                    width=10, bd=4,
                                    command = self.lance_date)
            btn_date.place (x=500,y=20)
     
     
     
            # champs
            ch_exp = tk.Text    (self.frame,
                                width='35', height='5',
                                font=('Arial',10,'normal'))
            ch_exp.configure  (bg='ivory')
            ch_exp.place (x=190, y=20)
     
    #        scroll_exp = tk.Scrollbar (self.frame, orient = tk.VERTICAL)
    #        scroll_exp.config (command = self.frame.ch_exp.yview)
    #        ch_exp (yscrollcommand = self.frame.scroll_exp.set)
    #        COMMENT PLACER LE SCROLLBAR MAINTENANT ?
    #        LE MELANGE des METHODES PLACE ET GRID N APPORTE RIEN ?!
     
     
            ch_date = tk.Text   (self.frame,
                                width='30', height='1',
                                font=('Arial',10,'normal'))
            ch_date.configure  (bg='ivory')
            ch_date.place (x=600, y=20)
     
     
     
        def lance_date(self):
            print 1
     
     
        def lance_exp(self):
            print 1
     
     
     
    if __name__ == '__main__':
        root = tk.Tk()
        root.title  ('Lettres')
        # suppress unwanted window
        root.withdraw()
        # main GUI, the parameter 0 means resizing turned off
        mainUI = uiClass(root,
                        '850x700',
                        '+300+5',
                        0)
        if not usingIDLE:
            root.mainloop()

  2. #2
    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
    Ceci te convient-il ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ch_exp = tk.Text(self.frame,
                             width='35', height='5',
                             font=('Arial',10,'normal') ,
                             bg='ivory')
     
    ch_exp.place (x=190, y=20)
     
    scroll_exp = tk.Scrollbar( self.frame, orient = tk.VERTICAL)
    scroll_exp.config (command = ch_exp.yview)
    ch_exp[ 'yscrollcommand' ] = scroll_exp.set
     
    scroll_exp.place( x=172, y=20, height = 83 )
    Il y avait beaucoup d'erreurs dans les lignes concernant le scrollBar


    J'ai testé le mélange de .place et .grid , semble ne pas marcher.
    Les methodes grid, place et pack ne peuvent pas être mélangées dans un même contenant ( Frame, Toplevel ... )
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  3. #3
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    Citation Envoyé par vincent.mbg Voir le message
    Les methodes grid, place et pack ne peuvent pas être mélangées dans un même contenant ( Frame, Toplevel ... )
    Tout à fait, c'est pourquoi il est plus facile de créer une frame contenant un widget text et deux scrollbars placés grâce à grid, puis de placer la frame grâce à place...

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 103
    Par défaut
    @Vincent:
    Ok, merci pour la correction du code Scrollbar et pour les conseils. Ca marche.

    @NTox :
    J' avais commencé en placant les widgets dans des frames, c' est efficace, mais c' est un peu lourd quand l interface est bien chargée, ca me fait créer une 20taine de frames en plus ...

    Faut-il donc préférer du "tout .grid" pour de lourdes interfaces ? Ou Comment font les pros ?

    Merci

  5. #5
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    le mieux c'est de d'utiliser la méthode de placement des 3 proposées la plus adaptée à la situation. Puisque chacune possède ses avantages et ses défauts.

    Place toutefois, ce n'est là qu'un avis personnel, n'est à utiliser qu'en dernier recours (par exemple pour créer un liste déroulante (en utilisant simplement le TKinter de base de la 2.5 hein)).

    En ce qui concerne l'alourdissement des Frame, je n'ai jamais pu le constater étant donné que j'ai une bonne machine de guerre... Par contre, je pense que l'utilisation de place force à faire appel à plein de fonctions et de calculs qui ralentissent l'exécution. Or si je ne raconte pas de bêtise, grid fait surtout appel à des fonctions écrites en C, qui sont elles, bien plus rapides.

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 103
    Par défaut .Grid
    Merci pour ces précieuses réponses!
    Je suis passé en .grid entre temps,bien. Mais pourquoi n' y a t-il pas la notion de droite ou gauche dans le padx, j'entends, espace uniquement à droite ou uniquement à gauche. Exemple: l' espace entre le "btn_date" et son champs devrait etre le meme qu' entre les autres boutons et leurs champs respectifs. Mais le btn date doit avoir un plus grand espace par-rapport au champs Expediteur (d ' òu le padx=20 au lieu de 5).
    Je pensais qu' un sticky=E m' aiderait, mais il n'apporte rien.

    Voici code allégé et screengrab:
    Merci

    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
     
    #--- modules ---
    import tkMessageBox, tkSimpleDialog, tkFileDialog, string
    import os.path, glob, sys
    import Tkinter as tk
    import ScrolledText
     
    from datetime import date
    # from Tkconstants import LEFT, RIGHT, TOP, BOTTOM, END, Y
     
     
    # sys.stdout = open('my_stdout.log', 'w')
    # sys.stderr = open('my_stderr.log', 'w')
     
     
    #--- classes ---
    class uiClass:
     
        # used once for main GUI
        # create a menu object tied to the root parent
        def __init__ (self,master,ar,xy,flex):
     
            # create the main GUI window with its menu object
            self.frame = tk.Toplevel    (relief='ridge', borderwidth=2)
     
     
            # sets its size and location
            self.frame.geometry (ar+xy)
            # (dis)allow resize horiz/vertical
            self.frame.resizable    (flex,flex)
     
            # widgets
            btn_exp = tk.Button     (self.frame,
                                    text = 'Expediteur',
                                    width=20, bd=4,
                                    command = () )
            btn_exp.grid (row=1, column=1, sticky=tk.N, padx=5 )
     
            btn_date = tk.Button    (self.frame,
                                    text='date',
                                    width=10, bd=4,
                                    command = () )
            btn_date.grid (row=1, column=4, sticky=tk.NE , padx=20 )
     
            btn_dest = tk.Button    (self.frame,
                                    text='Destinataire',
                                    width=20, bd=4,
                                    command= () )
            btn_dest.grid (row=2, column=1, sticky=tk.N, padx=5 )
     
            btn_suj = tk.Button     (self.frame,
                                    text = 'Sujet / Ref.',
                                    width=20, bd=4,
                                    command = ())
            btn_suj.grid (row=3, column=1, sticky=tk.N, padx=5 )
     
            # champs
            ch_exp = tk.Text    (self.frame,
                                width='35', height='5',
                                font=('Arial',10,'normal'))
            ch_exp.configure  (bg='ivory')
            ch_exp.grid (row=1, column=2, sticky=tk.N )
     
            scroll_exp = tk.Scrollbar ( self.frame, orient = tk.VERTICAL )
            scroll_exp.config (command = ch_exp.yview )
            ch_exp ['yscrollcommand'] = scroll_exp.set
            scroll_exp.grid (row=1, column=3, sticky=tk.S+tk.N )
     
     
            ch_date = tk.Text   (self.frame,
                                width = '30', height='1',
                                font = ( 'Arial',10,'normal') )
            ch_date.configure  (bg='ivory')
            ch_date.grid (row=1, column=5, sticky=tk.N )
     
     
            ch_dest = tk.Text   ( self.frame,
                                width='35', height='5',
                                font=('Arial',10,'normal') )
            ch_dest.configure  ( bg='ivory' )
            ch_dest.grid ( row=2, column=2, sticky=tk.N )
     
            scroll_dest = tk.Scrollbar ( self.frame, orient = tk.VERTICAL )
            scroll_dest.config (command = ch_dest.yview )
            ch_dest ['yscrollcommand'] = scroll_dest.set
            scroll_dest.grid (row=2, column=3, sticky=tk.S+tk.N )
     
     
            ch_suj = tk.Text    (self.frame,
                                width='80', height='2',
                                font=('Arial',10,'normal'))
            ch_suj.configure  (bg='ivory')
            ch_suj.grid (row=3, column=2, columnspan=4, sticky=tk.N+tk.W)
     
     
    if __name__ == '__main__':
        root = tk.Tk()
        root.title  ('Creation de Lettres')
        # suppress unwanted window
        root.withdraw()
        # main GUI, the parameter 0 means resizing turned off
        mainUI = uiClass(root,
                        '850x700',
                        '+300+5',
                        0)
        if not usingIDLE:
            root.mainloop()
    Images attachées Images attachées  

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/09/2008, 21h15
  2. Editeur de texte - liste des méthodes
    Par Carlito_superheros dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 30/03/2005, 12h52
  3. Réponses: 7
    Dernier message: 23/03/2005, 22h23
  4. [XSD] element texte non parsé
    Par bulbo dans le forum Valider
    Réponses: 13
    Dernier message: 10/01/2005, 11h44
  5. [FLASH MX] Probleme de scrollbar et texte dynamique
    Par Bisûnûrs dans le forum Flash
    Réponses: 6
    Dernier message: 28/06/2004, 21h12

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