Python tkinter, la liaison de la molette de défilement
J'ai cette mesure de défilement cadre (à l'intérieur du cadre de la toile en fait).
import Tkinter as tk
class Scrollbarframe():
def __init__(self, parent,xsize,ysize,xcod,ycod):
def ScrollAll(event):
canvas1.configure(scrollregion=canvas1.bbox("all"),width=xsize,height=ysize,bg='white')
self.parent=parent
self.frame1=tk.Frame(parent,bg='white')
self.frame1.place(x=xcod,y=ycod)
canvas1=tk.Canvas(self.frame1)
self.frame2=tk.Frame(canvas1,bg='white',relief='groove',bd=1,width=1230,height=430)
scrollbar1=tk.Scrollbar(self.frame1,orient="vertical",command=canvas1.yview)
canvas1.configure(yscrollcommand=scrollbar1.set)
scrollbar1.pack(side="right",fill="y")
canvas1.pack(side="left")
canvas1.create_window((0,0),window=self.frame2,anchor='nw')
self.frame2.bind("<Configure>",ScrollAll)
Je voudrais lier molette de la souris de la barre de défilement de sorte que l'utilisateur peut faire défiler vers le bas de l'image sans avoir à utiliser les boutons de flèche sur la barre de défilement. Après avoir regardé autour, j'ai ajouté un liant à mon canvas1
comme ce
self.frame1.bind("<MouseWheel>", self.OnMouseWheel)
C'est la fonction:
def OnMouseWheel(self,event):
self.scrollbar1.yview("scroll",event.delta,"units")
return "break"
Mais la barre de défilement ne bouge pas lorsque j'utilise la roulette de la souris. Quelqu'un peut-il m'aider? Tout ce que je veux, c'est quand l'utilisateur l'utilisation de la roulette de la souris (à l'intérieur de la zone d'image/sur la barre de défilement), la toile doit automatiquement faire défiler vers le haut ou vers le bas.
OriginalL'auteur Chris Aung | 2013-06-28
Vous devez vous connecter pour publier un commentaire.
Peut-être la solution la plus simple est de faire une liaison pour la roulette de la souris. Il sera alors le feu, peu importe ce widget est sous la souris ou le widget qui a le focus clavier. Vous pouvez alors sans condition de défilement de la toile, ou vous pouvez être intelligent et savoir qui de vos fenêtres doivent défiler.
Par exemple, sur windows vous ferait quelque chose comme ceci:
Noter que
self.canvas.bind_all
est un peu trompeur-vous plus correctement devrait appelerroot.bind_all
mais je ne sais pas quoi ou comment vous définissez votre fenêtre racine. Peu importe, les deux appels sont synonymes.Différences de plate-forme:
<MouseWheel>
et vous avez besoin de diviserevent.delta
par 120 (ou à un autre facteur dépend à quelle vitesse vous voulez les faire défiler)<MouseWheel>
et vous avez besoin d'utiliserevent.delta
sans modification<Button-4>
et<Button-5>
, et vous avez besoin de diviserevent.delta
par 120 (ou à un autre facteur dépend à quelle vitesse vous voulez faire défiler)Il y a de plus raffiné des solutions impliquant des événements virtuels et de déterminer dans quelle fenêtre a le focus ou est sous la souris, ou en passant le canevas de la fenêtre de référence par le biais de la liaison, mais j'espère que cela vous permettra de commencer.
J'ai essayé de l'utiliser (linux ici), mais ne pourrais pas le faire fonctionner, jusqu'à ce que j'ai remarqué que je me demande pourquoi l'événement.delta était toujours à zéro. Résolu en appelant simplement yview_scroll(direction, les"unités")
Oakley - ci fonctionne très bien si il n'y a qu'un défilement de la toile dans l'application. Mais si il y a deux ou plus, comment pouvez-vous limiter le défilement de l'un ou de l'autre?
Vous pouvez utiliser
winfo_containing
pour lequel la toile est sous le curseur, puis faites défiler cette toile.J'ai trouvé beaucoup de valeur dans ce one-liner en fonction de votre réponse, avec des modifications mineures:
self.canvas.bind_all('<MouseWheel>', lambda event: self.canvas.yview_scroll(int(-1*(event.delta/120)), "units"))
. À l'aide de Python 3.4, si le nombre n'est pas coulé comme unint
, interprète jette_tkinter.TclError: expected integer but got "1.0"
.OriginalL'auteur Bryan Oakley
@BryanOakley réponse, voilà une façon de faire défiler uniquement le widget (c'est à dire celui que vous avez le curseur de la souris actuellement plus).
Lier à
<Enter>
et<Leave>
événements qui se produisent sur votre cadre défilant, qui se trouve à l'intérieur d'une toile, de la manière suivante (scrollframe
est l'image qui est à l'intérieur de la toile):Merci, cette méthode a fonctionné pour moi. Mon cadre défilant était en train de défiler, même si la souris n'était pas en vol stationnaire au-dessus d'elle, qui était le vissage jusqu'à mon treeview défile dans la colonne à côté de lui qui dispose de sa propre builtin de défilement.
OriginalL'auteur Mikhail T.
Ce lien vous donne un exemple de comment utiliser la molette de défilement.
http://www.daniweb.com/software-development/python/code/217059/using-the-mouse-wheel-with-tkinter-python
J'espère que cela aide!
Tkinter
avectkinter
sur Py3Si ce lien à la baisse, cette réponse serait inutile. "Toujours citer la partie la plus pertinente d'un lien important, dans le cas où l'objectif du site est inaccessible ou va définitivement hors ligne." Merci d'éditer votre question pour éviter cela.
OriginalL'auteur Joe Michail
Pour se débarrasser de l'étrange facteur de 120 nous pourrions nous contenter de regarder le signe de l'événement.valeur delta. Cela rend plus facile à utiliser le gestionnaire de même sous Windows, Linux et Mac OS.
OriginalL'auteur Marvo