Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Tkinter] comment ajouter une scrollbar à un ensemble de ligne Label + Entry

3 réponses
Avatar
cyril.legret
Bonjour à tous,
Je veux créer un formulaire d'une centaine de lignes.
Sur chaque ligne, il y a un Label() et une Entry()
Lorsque je le fais, la fenêtre devient géante en sur la hauteur.
Comment faire pour limiter la hauteur à la taille de l'écran et
surtout ajouter une scrollbar pour faire défiler le formulaire.
Scrollbar() ne semble s'appliquer qu'à des Listbox(), Canvas() ou
Text() et pas à Tk() ou Frame()
Merci pour votre aide ...

3 réponses

Avatar
Eric Brunel
Cyril Legret wrote:
Bonjour à tous,
Je veux créer un formulaire d'une centaine de lignes.
Sur chaque ligne, il y a un Label() et une Entry()
Lorsque je le fais, la fenêtre devient géante en sur la hauteur.
Comment faire pour limiter la hauteur à la taille de l'écran et
surtout ajouter une scrollbar pour faire défiler le formulaire.
Scrollbar() ne semble s'appliquer qu'à des Listbox(), Canvas() ou
Text() et pas à Tk() ou Frame()
Merci pour votre aide ...


Pmw est ton ami: http://pmw.sourceforge.net/
Pmw.ScrolledFrame fait exactement ce que tu veux.

Si tu ne peux pas ou ne veux pas utiliser Pmw, la façon de faire est de créer
ton frame comme une window dans un Canvas, de configurer la scrollregion du
Canvas en fonction des dimensions de ton frame et d'attacher les scrollbars au
Canvas:

----------------------------------------------------
from Tkinter import *

## La fenetre, avec les options de grille qui vont bien
root = Tk()
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)

## Le canvas
cnv = Canvas(root)
cnv.grid(row=0, column=0, sticky='nswe')

## Les scrollbars
hScroll = Scrollbar(root, orient=HORIZONTAL, command=cnv.xview)
hScroll.grid(row=1, column=0, sticky='we')

vScroll = Scrollbar(root, orient=VERTICAL, command=cnv.yview)
vScroll.grid(row=0, column=1, sticky='ns')

cnv.configure(xscrollcommand=hScroll.set, yscrollcommand=vScroll.set)

## Le Frame, dans le Canvas, mais sans pack ou grid
frm = Frame(cnv)
## Les labels et entrys dans le frame
for i in range(50):
Label(frm, text='Label%s: ' % i).grid(row=i, column=0)
Entry(frm).grid(row=i, column=1)
## Pour etre sur que les dimensions sont calculées
frm.update()

## Création de la window dans le Canvas
cnv.create_window(0, 0, window=frm, anchor=NW)

## La scrollregion est la boite englobante pour tout ce qu'il y a dans le Canvas
cnv.configure(scrollregion=cnv.bbox(ALL))

## C'est parti!
root.mainloop()
----------------------------------------------------

HTH
--
- Eric Brunel <eric (underscore) brunel (at) despammed (dot) com> -
PragmaDev : Real Time Software Development Tools - http://www.pragmadev.com

Avatar
Olivier Ravard
"Eric Brunel" a écrit dans le message de news:
41e3ab4d$0$19396$
Cyril Legret wrote:
Bonjour à tous,
Je veux créer un formulaire d'une centaine de lignes.
Sur chaque ligne, il y a un Label() et une Entry()
Lorsque je le fais, la fenêtre devient géante en sur la hauteur.
Comment faire pour limiter la hauteur à la taille de l'écran et
surtout ajouter une scrollbar pour faire défiler le formulaire.
Scrollbar() ne semble s'appliquer qu'à des Listbox(), Canvas() ou
Text() et pas à Tk() ou Frame()
Merci pour votre aide ...


Pmw est ton ami: http://pmw.sourceforge.net/
Pmw.ScrolledFrame fait exactement ce que tu veux.



Il y a la même chose avec BWidget

Si tu ne peux pas ou ne veux pas utiliser Pmw, la façon de faire est de
créer

ton frame comme une window dans un Canvas, de configurer la scrollregion
du

Canvas en fonction des dimensions de ton frame et d'attacher les
scrollbars au

Canvas:

----------------------------------------------------
from Tkinter import *

## La fenetre, avec les options de grille qui vont bien
root = Tk()
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)

## Le canvas
cnv = Canvas(root)
cnv.grid(row=0, column=0, sticky='nswe')

## Les scrollbars
hScroll = Scrollbar(root, orient=HORIZONTAL, command=cnv.xview)
hScroll.grid(row=1, column=0, sticky='we')

vScroll = Scrollbar(root, orient=VERTICAL, command=cnv.yview)
vScroll.grid(row=0, column=1, sticky='ns')

cnv.configure(xscrollcommand=hScroll.set, yscrollcommand=vScroll.set)

## Le Frame, dans le Canvas, mais sans pack ou grid
frm = Frame(cnv)
## Les labels et entrys dans le frame
for i in range(50):
Label(frm, text='Label%s: ' % i).grid(row=i, column=0)
Entry(frm).grid(row=i, column=1)
## Pour etre sur que les dimensions sont calculées
frm.update()

## Création de la window dans le Canvas
cnv.create_window(0, 0, window=frm, anchor=NW)

## La scrollregion est la boite englobante pour tout ce qu'il y a dans le
Canvas

cnv.configure(scrollregion=cnv.bbox(ALL))

## C'est parti!
root.mainloop()
----------------------------------------------------

HTH
--
- Eric Brunel <eric (underscore) brunel (at) despammed (dot) com> -
PragmaDev : Real Time Software Development Tools -
http://www.pragmadev.com



Avatar
David Douard
Eric Brunel wrote:

Cyril Legret wrote:
Bonjour à tous,
Je veux créer un formulaire d'une centaine de lignes.
Sur chaque ligne, il y a un Label() et une Entry()
Lorsque je le fais, la fenêtre devient géante en sur la hauteur.
Comment faire pour limiter la hauteur à la taille de l'écran et
surtout ajouter une scrollbar pour faire défiler le formulaire.
Scrollbar() ne semble s'appliquer qu'à des Listbox(), Canvas() ou
Text() et pas à Tk() ou Frame()
Merci pour votre aide ...


Pmw est ton ami: http://pmw.sourceforge.net/
Pmw.ScrolledFrame fait exactement ce que tu veux.



Un exemple rapide, en supposant que les intitulés des labels et les
stringvars pour chaque Entry sont dans une liste de dictionnaires (avec 2
étiquettes, 'label' et 'entryvar'), :

import Pmw
def create_form(master, form_dict):
scroll_frame = Pmw.ScrolledFrame(master)
widgets = []
for e in form_dict:
f = Pmw.EntryField(scroll_frame.interior(), labelpos='w',
label_text=e['label'], entry_textvariable=e['entryvar'])
f.pack(side='w', fill='x', expand=1)
widgets.append(f)
Pmw.alignlabels(widgets)
scroll_frame.pack(exapnd=1, fill='both')


Voilà,
David