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 :

Redimensionner un Frame avec un Scrollbar après appel d'une fonction


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Homme Profil pro
    --
    Inscrit en
    Juin 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : --

    Informations forums :
    Inscription : Juin 2017
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Redimensionner un Frame avec un Scrollbar après appel d'une fonction
    Bonjour,
    je cherche à pouvoir utiliser des Scrollbars après que l'appel d'une fonction ait rajouté des boutons dans le frame.
    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
    # coding=UTF-8
    from tkinter import ttk
    from tkinter import * #pour créer des boutons, des champs d'entrée,...
    from tkinter.ttk import * #to create notebook
    root = Tk()
    nb = Notebook(root)
     
    # adding Frames as pages for the ttk.Notebook 
    # first page, which would get widgets gridded into it
    p1 = Frame(nb)
    p2 = Frame(nb)
    nb.add(p1, text='page 1')
    nb.add(p2, text='page 2')
     
     
    def create_button():
        for i in range(int(_num.get())): #give the number write in Spinbox
            Button(_frame,text='texte').grid(column=1,row=line+2+i) #create as many buttons as number chosen in Spinbox
     
     
    #scroll bar
    vsb = Scrollbar(p2, orient=VERTICAL)
    vsb.grid(column=1, row=2,sticky=N+S)
    hsb = Scrollbar(p2, orient=HORIZONTAL)
    hsb.grid(column=0, row=3, sticky=E+W)
     
    #canvas
    canvas = Canvas(p2,yscrollcommand=vsb.set, xscrollcommand=hsb.set) 
    canvas.grid(column=0, row=2, sticky="news")
     
    vsb.config(command=canvas.yview)
    hsb.config(command=canvas.xview)
    # make the canvas expandable
    p2.grid_rowconfigure(0, weight=1)
    p2.grid_columnconfigure(0, weight=1)
     
    _frame=Frame(canvas) #create a frame to add widgets
    _frame.rowconfigure(1, weight=1)
    _frame.columnconfigure(1, weight=1)
     
     
    line=0
    _num=StringVar()
    _num.set('30')
    Spinbox(_frame,from_=0,to=50,textvariable=_num,command=create_button).grid(column=1,row=line+1)   #the number give the number of buttons
     
    #
    canvas.create_window(0, 0,window=_frame)
    _frame.update_idletasks()
    canvas.config(scrollregion=canvas.bbox("all"))
     
    #
    nb.grid(column=0,row=0,sticky='nsew')
    root.mainloop()
    Sauf que lorsque les Buttons sont ajoutés dès qu'on clique sur les flèches du spinbox, le _frame et les scrollbars ne se sont pas redimensionnés.

    Mais si j'appelle create_button() ligne 47 par exemple, les scrollbars fonctionnent correctement.

    Merci pour vos réponses.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 778
    Points
    36 778
    Par défaut
    Salut,

    Citation Envoyé par bob rajowski Voir le message
    Mais si j'appelle create_button() ligne 47 par exemple, les scrollbars fonctionnent correctement.
    A l'instant t, les scrollbar s'appliquent à la scrollregion définie par le dernier canvas.bbox("all") et généralement plus grande que ce que peut montrer la fenêtre du Canvas.

    Si en t+1, on change les dimensions d'un item du Canvas, il faut ajuster cette scrollregion.

    note: et comme il s'agit ici d'une "window" ne pas oublier un .update_idletasks pour que ses dimensions prennent en compte les widgets qui y ont été ajoutés.

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

  3. #3
    Candidat au Club
    Homme Profil pro
    --
    Inscrit en
    Juin 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : --

    Informations forums :
    Inscription : Juin 2017
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci pour la réponse,
    ça marche, maintenant que je comprends mieux à quoi sert .bbox("all") et .update_idletasks !

Discussions similaires

  1. appel d'une fonction avec parametre.
    Par rollernox dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 12/10/2006, 23h07
  2. Appel d'une fonction d'une autre frame
    Par irenee dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 05/09/2006, 22h51
  3. problème avec l'appel d'une fonction
    Par mademoizel dans le forum ASP
    Réponses: 5
    Dernier message: 26/06/2006, 15h04
  4. Réponses: 8
    Dernier message: 09/01/2006, 16h58
  5. [FPDF] Erreur après appel d'une fonction avec include
    Par orus8 dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 04/11/2005, 10h49

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