Test de scroll bar Tkinter

Résolu/Fermé
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 - 27 juil. 2021 à 17:19
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 - 28 juil. 2021 à 19:18
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

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

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.

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().
1
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 28 juil. 2021 à 13:38
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:

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 ?
0
klopinklopan
28 juil. 2021 à 14:43
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.
0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
28 juil. 2021 à 19:18
OK, en tout cas ca marche bien avec MouseWheel

Merci pour tes réponses quand même !
0