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

Python Discussion :

Scrollbar dans notebook uniquement si nécéssaire


Sujet :

Python

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Par défaut Scrollbar dans notebook uniquement si nécéssaire
    Bonjour, dans une fenêtre j'ai un onglet qui contient une scrollbar. Je voudrai que la scrollbar ne soit visible que lorsque le texte déborde.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            # Adds tab 1 of the notebook
            page1 = ttk.Frame(self.nb)
            self.nb.add(page1, text='Texte')
     
            # Add the textbox
            self.tbox1 = Text(page1, bg="grey", wrap=WORD)
            self.tbox1.pack(fill=BOTH, expand=1)
     
    	# Add the Scrollbar
            scrollbar = Scrollbar(self.tbox1)
            scrollbar.pack(side=RIGHT, fill=Y)
    En css, c'est tout simple. Y'a t-il un moyen simple en python permettant de rendre invisible la barre de défilement si le texte est suffisamment court. Merci d'avance de vos réponses.
    Arsène

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

    Vous pouvez vous inspirez de cette AutoScrollbar.

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

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Par défaut
    J'avais vu cet exemple mais j'avais pas su l'adapter. Et pour le moment je sais toujours pas. Je cherche à faire des choses assez basiques pour débuter.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    Par défaut
    Citation Envoyé par Arsene12 Voir le message
    J'avais vu cet exemple mais j'avais pas su l'adapter. Et pour le moment je sais toujours pas. Je cherche à faire des choses assez basiques pour débuter.
    Et il faut commencer par mettre une/des Scrollbar associé à un Text widget dans une Frame. Pour çà vous pouvez déjà vous inspirer des scrollbar patterns, puis ajouter la fonctionnalité d'autohide.

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

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Par défaut
    Merci. Je venais de me rendre compte justement que la scrollbar que j'avais insérée n'était pas liée au texte. J'ai donc complété mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # Add the scrollbar
    scrollbar = Scrollbar(self.tbox1)
    scrollbar.pack(side=RIGHT, fill=Y)
    self.tbox1.pack()
    # attach self.tbox1 to scrollbar
    self.tbox1.config(yscrollcommand=scrollbar.set)
    scrollbar.config(command=self.tbox1.yview)
    Lorsque y'a pas assez de texte la scrollbar apparaît grisée sans curseur. C'est là que je voudrais la masquer. Et je constate en plus qu'elle empiète sur le texte. Il faudrait que je mette une marge pour résoudre ce problème.

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

    A partir des exemples, j'écrirai cela ainsi:

    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
    from tkinter import *
     
    class AutoScrollbar(Scrollbar):
        # a scrollbar that hides itself if it's not needed.  only
        # works if you use the grid geometry manager.
        def set(self, lo, hi):
            if float(lo) <= 0.0 and float(hi) >= 1.0:
                self.grid_remove()
            else:
                self.grid()
            Scrollbar.set(self, lo, hi)
        def pack(self, **kw):
            raise TclError ("cannot use pack with this widget")
        def place(self, **kw):
            raise TclError ("cannot use place with this widget")
     
     
     
    root = Tk()
    frame = Frame(root, bd=2, relief=SUNKEN)
     
    ## frame.grid_rowconfigure(0, weight=1)
    ## frame.grid_columnconfigure(0, weight=1)
     
    ## xscrollbar = Scrollbar(frame, orient=HORIZONTAL)
    ## xscrollbar.grid(row=1, column=0, sticky=E+W)
     
    yscrollbar = AutoScrollbar(frame)
    yscrollbar.grid(row=0, column=1, sticky=N+S)
     
    text = Text(frame, #wrap=NONE, bd=0,
                ## xscrollcommand=xscrollbar.set,
                yscrollcommand=yscrollbar.set,)
     
    text.grid(row=0, column=0, sticky=N+S+E+W)
     
    ## xscrollbar.config(command=text.xview)
    yscrollbar.config(command=text.yview)
     
    frame.pack()
     
    mainloop()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Par défaut
    Merci beaucoup pour ce code. J'ai essayé de l'adapter à mon tour. 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
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    from tkinter import *
    import os
    from PIL import Image, ImageTk
    from tkinter import Scrollbar, RIGHT, Y
    from tkinter import Tk, Frame, Menu, Button, Text, E, W, S, N, WORD, ttk, NW
    from tkinter import LEFT, TOP, X, FLAT, RAISED, BOTH, END
     
    class AutoScrollbar(Scrollbar):
        # a scrollbar that hides itself if it's not needed.  only
        # works if you use the grid geometry manager.
        def set(self, lo, hi):
            if float(lo) <= 0.0 and float(hi) >= 1.0:
                self.grid_forget()
            else:
                self.grid(row=0, column=1, sticky=N+S)
            Scrollbar.set(self, lo, hi)
        def pack(self, **kw):
            raise TclError ("cannot use pack with this widget")
        def place(self, **kw):
            raise TclError ("cannot use place with this widget")
     
     
    class Example(Frame):
     
        def __init__(self):
            super().__init__()
     
            self.initUI()
     
        def initUI(self):
     
     
            # Add the textbox
     
            # Defines and places the notebook widget
     
            self.nb = ttk.Notebook(self.master)        
     
            #self.self.nb.grid(row=0, column=0, columnspan=50, rowspan=49, sticky='NESW')
     
            # Adds tab 1 of the notebook
            page1 = ttk.Frame(self.nb)
            self.nb.add(page1, text='Texte')
     
            # Add the textbox
     
            self.tbox1 = Text(page1, wrap=WORD)
            self.tbox1.pack(fill=BOTH, expand=1)        
     
            # Add the scrollbar
     
            scrollbar = Scrollbar(self.tbox1)   
            #scrollbar = AutoScrollbar(self.tbox1)       
            scrollbar.pack(side=RIGHT, fill=Y)
            self.tbox1.pack()
     
            # attach self.tbox1 to scrollbar
            self.tbox1.config(yscrollcommand=scrollbar.set, borderwidth=10)        
            scrollbar.config(command=self.tbox1.yview)
     
            self.tbox1.insert(0.0, 1000*"blablabla")        
            self.nb.pack(fill=BOTH, expand=1)
     
     
    def main():
     
        root = Tk()    
        root.geometry("850x650+100+100")
     
        app = Example()
     
        root.mainloop()  
     
    if __name__ == '__main__':
        main()
    J'obtiens une scrollbar grisée lorsque le texte est trop court. Par ailleurs la scrollbar empiète sur les bords de mon texte, il va falloir que je règle ce problème.

    Nom : Img2.png
Affichages : 573
Taille : 10,8 Ko

    Si je remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scrollbar = Scrollbar(self.tbox1)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     scrollbar = AutoScrollbar(self.tbox1)     
    , je suis obligé de commenter les lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        #def pack(self, **kw):
            #raise TclError ("cannot use pack with this widget")
        #def place(self, **kw):
            #raise TclError ("cannot use place with this widget")
    et j'obtiens le résultat suivant :

    Nom : myImg.png
Affichages : 519
Taille : 17,7 Ko

    Quand je clique sur les flèches de la scrollbar, ça fait quand même défiler le texte. Et la scrollbar disparaît lorsque je raccourci suffisamment le texte. Ce qui m'indique que je suis sur la bonne voie.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Par défaut
    Je viens de trouver un code très court qui insère une scrollbar mais y'a pas d'option autohide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import tkinter 
    import tkinter.scrolledtext
     
    tk = tkinter.Tk() 
    text = tkinter.scrolledtext.ScrolledText(tk)
    text.pack()
    tk.mainloop()

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

    Si j'ajoute un notebok à mon code, çà donne:
    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
    from tkinter import *
    import tkinter.ttk as ttk
     
    class AutoScrollbar(Scrollbar):
        # a scrollbar that hides itself if it's not needed.  only
        # works if you use the grid geometry manager.
        def set(self, lo, hi):
            if float(lo) <= 0.0 and float(hi) >= 1.0:
                self.grid_remove()
            else:
                self.grid()
            Scrollbar.set(self, lo, hi)
        def pack(self, **kw):
            raise TclError ("cannot use pack with this widget")
        def place(self, **kw):
            raise TclError ("cannot use place with this widget")
     
     
    def create_frame(master):
        frame = Frame(master, bd=2, relief=SUNKEN)
        yscrollbar = AutoScrollbar(frame)
        yscrollbar.grid(row=0, column=1, sticky=N+S)
        text = Text(frame, 
                    yscrollcommand=yscrollbar.set,)
     
        text.grid(row=0, column=0, sticky=N+S+E+W)
        yscrollbar.config(command=text.yview)
        return frame
     
    if __name__ == '__main__':
        root = Tk()
     
        nb = ttk.Notebook(root)
        frame = create_frame(nb)
     
        nb.add(frame, text='text')
        nb.pack()
     
        mainloop()
    et çà fonctionne tout seul car je m'applique à respecter la hiérarchie des widgets.
    Et si vous partez bille en tête d'y ajouter une hiérarchie de "class" un peu à rebrousse poil par dessus... Sûr que çà devient "a little bit complicated"..
    note: j'ai essayé de lire votre code, mais j'ai vite abandonné car il me faudrait prendre un papier et un crayon pour le comprendre.

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

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Par défaut
    Merci une nouvelle fois pour ce code. C'est presque ça mais y'a quelques ajustements qui me restent encore à faire :

    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
    from tkinter import *
    from PIL import Image, ImageTk
    from tkinter import filedialog, ttk
    class AutoScrollbar(Scrollbar):
        # a scrollbar that hides itself if it's not needed.  only
        # works if you use the grid geometry manager.
        def set(self, lo, hi):
            if float(lo) <= 0.0 and float(hi) >= 1.0:
                self.grid_remove()
            else:
                self.grid()
            Scrollbar.set(self, lo, hi)
        def pack(self, **kw):
            raise TclError ("cannot use pack with this widget")
        def place(self, **kw):
            raise TclError ("cannot use place with this widget")
     
     
    def create_frame(master):
        frame = Frame(master, bd=2, relief=SUNKEN)
        yscrollbar = AutoScrollbar(frame)
        yscrollbar.grid(row=0, column=1, sticky=N+S)
        text = Text(frame, 
                    yscrollcommand=yscrollbar.set,)
     
        text.grid(row=0, column=0, sticky=N+S+E+W)
        yscrollbar.config(command=text.yview)    
        return frame
     
    if __name__ == '__main__':
        root = Tk()
     
        root.title("MonkeyCode Editor")
     
     
        nb = ttk.Notebook(root)
        frame = create_frame(nb)
        nb.add(frame, text='text')
     
        frame2 = create_frame(nb)
        nb.add(frame2, text='Text2')
     
        frame3 = create_frame(nb)
        nb.add(frame3, text='Text3')
     
        frame4 = create_frame(nb)
        nb.add(frame4, text='Text4')
     
        root.geometry("850x650+100+100")
     
        nb.pack()
        mainloop()

    J'ai donc refait le code en y mettant 4 onglets. Quand on ouvre ce fichier, on constate que la barre de défilement apparaît en grisé. Il faut cliquer un à un sur les onglets pour qu'à la fin elle disparaisse. Si on injecte un texte suffisamment long dans le champs de texte d'un onglet et que la barre de défilement réapparaît, elle réapparaît également en grisé dans les autres onglets. Le vrai problème c'est que lorsque la barre de défilement apparaît ou disparaît, la dimension de la fenêtre de l'application change. Il faudrait qu'elle soit figée et que la barre de défilement n'empiète pas sur le texte non plus. Et il faudrait pour terminer que le Frame soit de la même dimension que le root, même lorsqu'on l'étire.

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Par défaut
    J'ai réglé une partie du problème :

    J'ai remplacé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nb.pack(expand=YES, fill=BOTH)
    La barre de défilement n'empiète plus sur le texte car elle se rajoute sur la droite de celui-ci. Par contre j'aimerai que la zone de texte occupe tout l'espace de la fenêtre moins la largeur de la barre de défilement lorsque celle-ci apparait.

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

    Citation Envoyé par Arsene12 Voir le message
    Par contre j'aimerai que la zone de texte occupe tout l'espace de la fenêtre moins la largeur de la barre de défilement lorsque celle-ci apparait.
    Ce sont d'autres sujets. Car, quelque part, qu'est ce qui fait la dimension d'un widget Text? Le nombre de lignes et de colonnes à afficher + la taille de la police de caractères utilisée. Puis si je veux donner à cette fenêtre là une dimension "fixe" et que j'ajoute une Scrollbar à droite, est-ce qu'on agrandit le contenant ou est-ce qu'on réduit la place occupée par les autres widgets.
    Il y a des tas d'options à regarder côté geometry manager (.grid et .pack) et côté propagation des redimensionnements.

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

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Par défaut
    Bonjour,

    dans la fonction create_frame j'ai rajouté ce bout de code qui me permet de définir la taille de la zone de texte de l'onglet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    
    def create_frame(master, size):
        frame = Frame(master, bd=2)
        text = Text(frame, yscrollcommand=yscrollbar.set)
        text.config( width=size, height=30)

    et j'ai définis size :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if __name__ == '__main__':
        root = Tk()
        size = 50
        nb = ttk.Notebook(root)
        frame1 = create_frame(nb,size)

    Il faudrait que size soit égal à la largeur de l'application.
    Je sais comment on obtiens la largeur de l'écran (winfo_screenwidth()) mais lorsque j'essaye de récupérer la largeur de la frame, j'y arrive pas. J'essaye

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        nb.pack(expand=YES, fill=BOTH)
        print(nb.winfo_width())
        print(root.winfo_width())
    j'obtiens :
    1
    1

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

    Autre problème = autre cas de figure où on essaie d'abord de comprendre les détails avant de l'utiliser ailleurs.

    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 as tk
     
    root = tk.Tk()
     
    frame = tk.Frame(root, bg='green')
    frame.pack()
     
    def do_flip():
        if not label.winfo_manager():
            label.grid()
        else:
            label.grid_remove()
     
    frame.grid_columnconfigure(0, weight=1) # expansion de la colonne        
    text = tk.Text(frame, bg='grey')
    text.grid(row=0, column=0, sticky='nwse') # expansion du widget Text
    for _ in range(24):
        text.insert ('end', (' 123456789' * 8) + '\n')
    btn = tk.Button(frame, text='toggle', bg='blue', command=do_flip)
    btn.grid(row=1, column=0, sticky='ew', columnspan=2)
    label = tk.Label(frame, text='flip', bg='red')
    label.grid(row=0, column=1, sticky='ns')
    frame.update()          # on met à jour la Frame
    frame.grid_propagate(0) # on gèle ses dimensions
     
    tk.mainloop()
    toutes les lignes commentées doivent être comprises.

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

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Par défaut
    Merci pour ce code mais j'arrive pas à l'exécuter à cause d'une erreur "invalid syntax" qui pointe sur le for _ in range.

    Par ailleurs pour obtenir les dimension du root, il faut faire un update() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        nb.pack(expand=YES, fill=BOTH)
        nb.update()    
        print(nb.winfo_width()) 
        print(root.winfo_width())
        print(nb.winfo_height())
        print(root.winfo_height())

  16. #16
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    Par défaut
    Citation Envoyé par Arsene12 Voir le message
    Merci pour ce code mais j'arrive pas à l'exécuter à cause d'une erreur "invalid syntax" qui pointe sur le for _ in range.
    Oops, j'ai laissé trainer un '#' dans la ligne précédente: c'est corrigé.

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

  17. #17
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Par défaut
    J'aurai pu détecter l'erreur tout seul, excusez-moi. En exécutant le code je constate que la taille du frame reste figé lorsque j'étire l'application. Si j'active ou désactive la ligne frame.grid_propagate(0) , le résultat est le même. Je voudrai que le frame s'étire lui aussi :

    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
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
     
    from tkinter import Tk, Text, TOP, BOTH, X, N, LEFT
    from tkinter.ttk import Frame
     
     
    class Example(Frame):
     
        def __init__(self):
            super().__init__()   
     
            self.initUI()
     
     
        def initUI(self):
     
            self.master.title("Review")
            self.pack(fill=BOTH, expand=True)
     
     
            frame3 = Frame(self)
            frame3.pack(fill=BOTH, expand=True)
     
            size = int(self.master.winfo_width()-50)
            print (size)
            txt = Text(frame3)
     
            txt.config( width=size, height=50)
     
            txt.pack(fill=BOTH, pady=5, padx=100, expand=True)
     
            self.master.update()
     
            print(self.master.winfo_width())
            print(self.master.winfo_width())
            print (self.master.winfo_height())
            print (self.master.winfo_geometry())              
     
    def main():
     
        root = Tk()
        root.geometry("300x300+300+300")
        app = Example()
        root.mainloop()
     
    if __name__ == '__main__':
        main()

  18. #18
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    Par défaut
    Citation Envoyé par Arsene12 Voir le message
    En exécutant le code je constate que la taille du frame reste figé lorsque j'étire l'application. Si j'active ou désactive la ligne frame.grid_propagate(0) , le résultat est le même.
    Je voudrai que le frame s'étire lui aussi
    Pour faire çà, avec le code que je vous ai donné, il y a 2 lignes à mettre en commentaires et une ligne à ajouter. Il suffit d'essayer de comprendre...
    Pataugez un peu
    note: pour moi l'important n'est pas que votre code fonctionne "rapidement" mais tout ce que vous apprenez en essayant de le mettre au point.

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

  19. #19
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Par défaut
    Merci pour toutes ces indications. Malheureusement je dois avouer que je nage un peu dans cette histoire de grid, de row et de column. Je vais cogiter ce week-end et peut-être qu'à la fin je trouverai la solution.

    J'ai simplifié le code et je vais y travailler dessus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import tkinter as tk
    from tkinter import Tk, Text, BOTH, YES
     
    root = tk.Tk()
     
    frame = tk.Frame(root, bg='green')
    frame.pack(fill=BOTH, expand=YES)
    text = tk.Text(frame, bg='lightgray')
    #text.grid(row=0, column=0 , sticky='nwse') # expansion du widget Text
    text.grid() # expansion du widget Text  
     
    text.insert(0.0, 1000*"0Texte1")
     
    tk.mainloop()
    Je n'arrive pas à comprendre ce qui fixe les dimension de l’application lorsque le code est lancé. Y'a ni width ni lenght d'indiqué et quand on met row=8 ou column=6, ça ne change rien.

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

    Citation Envoyé par Arsene12 Voir le message
    Je n'arrive pas à comprendre ce qui fixe les dimension de l’application lorsque le code est lancé. Y'a ni width ni lenght d'indiqué et quand on met row=8 ou column=6, ça ne change rien.
    Par défaut, tout widget qui va afficher quelque chose occupera une surface rectangulaire. .grid et .pack vont placer les différents widgets et aligner les différentes surfaces en distribuant (ou pas) l'espace restant.
    Et on a plein de variantes suivant qu'on veut que la surface résultante soit affichée (ou pas) par le parent (propagation).
    Et si je modifie mon exemple pour que la Frame s’agrandisse lorsque la fenêtre/Toplevel est agrandie par l'utilisateur:
    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
    import tkinter as tk
     
    root = tk.Tk()
     
    frame = tk.Frame(root, bg='green')
    frame.pack(fill='both', expand=True)
     
    def do_flip():
        if not label.winfo_manager():
            label.grid()
        else:
            label.grid_remove()
     
    frame.grid_columnconfigure(0, weight=1) # expansion de la colonne
    frame.grid_rowconfigure(0, weight=1) # expansion de la colonne        
    text = tk.Text(frame, bg='grey')
    text.grid(row=0, column=0, sticky='nwse') # expansion du widget Text
    for _ in range(24):
        text.insert ('end', (' 123456789' * 8) + '\n')
    btn = tk.Button(frame, text='toggle', bg='blue', command=do_flip)
    btn.grid(row=1, column=0, sticky='ew', columnspan=2)
    label = tk.Label(frame, text='flip', bg='red')
    label.grid(row=0, column=1, sticky='ns')
    ## frame.update()          # on met à jour la Frame
    ## frame.grid_propagate(0) # on gèle ses dimensions
     
    tk.mainloop()
    Et dans ce cas, on dit aussi que le "surplus" ira agrandir le widget Text.

    - 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.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [css] scrollbar dans un div
    Par tooms2028 dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 17/06/2007, 09h18
  2. Position d'une ScrollBar dans un TRichEdit (ou TMemo)
    Par Troll dans le forum C++Builder
    Réponses: 9
    Dernier message: 24/02/2005, 15h18
  3. Position de la scrollbar dans un div
    Par VolVic dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 03/01/2005, 15h25
  4. deplacer scrollbar dans calque
    Par prodi_64 dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 21/12/2004, 12h18
  5. [VB.NET] Disparition scrollBar dans une DataGrid
    Par aphykite dans le forum Windows Forms
    Réponses: 4
    Dernier message: 06/10/2004, 10h29

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