Test de scroll bar Tkinter
Résolu
Phil_1857
Messages postés
1956
Statut
Membre
-
Phil_1857 Messages postés 1956 Statut Membre -
Phil_1857 Messages postés 1956 Statut Membre -
Bonjour,
Le petit programme ci-dessous me permet de tester les scroll bar sous Tkinter
Il fonctionne lorsque l'on déplace la barre avec la souris
Par contre, si l'on place le curseur dans le canvas, et que l'on tourne la molette, il n'y a pas de défilement, alors que cela fonctionne si l'on remplace le canvas par un widget style Listbox
Si quelqu'un a une idée ....
Merci par avance
Le petit programme ci-dessous me permet de tester les scroll bar sous Tkinter
Il fonctionne lorsque l'on déplace la barre avec la souris
Par contre, si l'on place le curseur dans le canvas, et que l'on tourne la molette, il n'y a pas de défilement, alors que cela fonctionne si l'on remplace le canvas par un widget style Listbox
Si quelqu'un a une idée ....
Merci par avance
from tkinter import * import tkinter.font def display_fonts(): x0, y0 = 15, 25 for fname in sorted(tkinter.font.families()): graph_area.create_text(x0, y0, text = fname, font = (fname,12), anchor = SW) y0 += 25 main_win.title('Fontes ({})'.format(int(y0/25-1))) WIDTH, HEIGHT = 400, 500 main_win = Tk() main_win.geometry(str(WIDTH)+'x'+str(HEIGHT)+'+700+40') f1 = Frame(main_win) f1.place(x=0,y=0) graph_area = Canvas(f1, bg='ivory', height=HEIGHT-5,width=WIDTH-50) graph_area.pack(side = LEFT,fill=X) scroll = Scrollbar(f1 ,orient='vertical', command=graph_area.yview) scroll.pack(expand = YES, fill = Y) graph_area.configure(yscrollcommand=scroll.set) display_fonts() graph_area.configure(scrollregion=graph_area.bbox(ALL)) main_win.mainloop()
Configuration: Windows / Edge 92.0.902.55
A voir également:
- Tkinter listbox scrollbar
- Double scrollbar ✓ - Forum CSS
- Listbox index - Forum VB / VBA
- Vba listbox ✓ - Forum VB / VBA
- Utilisation de listbox - Forum Bureautique
- Trié un listBox ✓ - Forum Programmation
3 réponses
Bonjour,
Il y a besoin pour ce faire de lier les evénements roulette souris au scroll du canevas.
Une petite fonction pour agir sur le défilement du canevas via le yview, UNITS est une constante tk.
Puis finalement lier les actions molette à cette fonction.
Normalement, ça devrait fonctionner au poil, si non, s'assurer que le canevas à le focus en utilisant focus_set().
Il y a besoin pour ce faire de lier les evénements roulette souris au scroll du canevas.
Une petite fonction pour agir sur le défilement du canevas via le yview, UNITS est une constante tk.
def mouse_wheel(evt): if evt.num == 4: graph_area.yview('scroll', -1, UNITS) elif evt.num == 5: graph_area.yview('scroll', 1, UNITS)
Puis finalement lier les actions molette à cette fonction.
graph_area.bind('<Button-4>', mouse_wheel) graph_area.bind('<Button-5>', mouse_wheel)
Normalement, ça devrait fonctionner au poil, si non, s'assurer que le canevas à le focus en utilisant focus_set().
Bonjour klopinklopan,
Ca ne fonctionne pas, même avec le focus: en faisant un print, j'ai vu que l'on entre pas dans la fonction mouse_wheel(): j'en conclus que les bind ne sont pas bons
Or, entre temps, j'ai trouvé ceci:
avec l'attribut delta de evt
En faisant un print de evt.delta, je vois qu'on incrémente de 120 à chaque mouvement, j'ai donc fait ceci pour ralentir un peu:
Ceci dit, comme je le disais dans mon message initial, cela fonctionne avec une Listbox, sans cette fonction additionnelle, on peut en conclure que toute cette mécanique est déjà incluse dans ce type de widget ?
Ca ne fonctionne pas, même avec le focus: en faisant un print, j'ai vu que l'on entre pas dans la fonction mouse_wheel(): j'en conclus que les bind ne sont pas bons
Or, entre temps, j'ai trouvé ceci:
graph_area.bind('<MouseWheel>', mouse_wheel)
avec l'attribut delta de evt
En faisant un print de evt.delta, je vois qu'on incrémente de 120 à chaque mouvement, j'ai donc fait ceci pour ralentir un peu:
def mouse_wheel(evt): graph_area.yview('scroll', int(evt.delta/120)*-1, UNITS)
Ceci dit, comme je le disais dans mon message initial, cela fonctionne avec une Listbox, sans cette fonction additionnelle, on peut en conclure que toute cette mécanique est déjà incluse dans ce type de widget ?
En effet, Button-4 et Button-5 ne fonctionnent que sur linux, sur windows faut se servir de MouseWheel et là je ne sais pas comment c'est géré...
Et comme je n'ai pas de windows sous la main, je ne peux tester.
Je pense que oui, Listbox inclus cela, faudrait regarder dans la source python de tkinter et également sur le site de tcl/tk.
Et comme je n'ai pas de windows sous la main, je ne peux tester.
Je pense que oui, Listbox inclus cela, faudrait regarder dans la source python de tkinter et également sur le site de tcl/tk.