Ich stehe vor einem interessanten Problem:
Im Gegensatz zu anderen will ich kein Mousewheel-Event fangen sondern ich würde ich gerne das Mousewheel-Event bei Textwidgets deaktivieren!
Tkinter scheint dies bei Textfeldern automatisch zu fangen und so das Textfeld, das den Focus besitzt, immer mitscrollen!
Folgendes soll aus Beispielcode dienen:
Code: Alles auswählen
# -*- coding: ISO-8859-15 -*-
import Tkinter
root = Tkinter.Tk()
# Listbox-Scrollbar
lb_sb = Tkinter.Scrollbar(root, orient='vertical')
lb_sb.grid(row=0, column=1, sticky='ns')
# Listbox
lb = Tkinter.Listbox(root, yscrollcommand=lb_sb.set)
lb.grid(row=0, column=0, sticky='nsew')
lb_sb.config(command=lb.yview)
# Textfeld Scrollbar
txt_sb = Tkinter.Scrollbar(root, orient='vertical')
txt_sb.grid(row=1, column=1, sticky='ns')
# Textfeld
txt = Tkinter.Text(root, yscrollcommand=txt_sb.set)
txt.grid(row=1, column=0, sticky='nsew')
txt_sb.config(command=txt.yview)
def scrollupordown(event):
"""Eventhandler"""
if event.num == 5 or event.keycode == -120:
lb.yview_scroll(2, Tkinter.UNITS)
if event.num == 4 or event.keycode == 120:
lb.yview_scroll(-2, Tkinter.UNITS)
# Mausrad an die Listbox binden
root.bind('<MouseWheel>',scrollupordown)
# Widgets befüllen
map(lambda i:lb.insert('end', i), range(20))
map(lambda i:txt.insert('end', '%s\n'%i), range(40))
root.mainloop()
Solange das Textfeld keinen Focus besitzt wird die entsprechende Listbox wie im Eventhandler beschrieben gescrollt. Erhält das Textfenster dann jedoch den Focus wird dies bei einer Mausradbewegung immer mitgescrollt und verliert den Focus - bezogen auf Mausrad-Event - nie wieder!
Folgendes habe ich bereits probiert um sicherzustellen das nur die Listbox den Focus hat:
Code: Alles auswählen
def scrollupordown(event):
"""Eventhandler"""
# alter Focus speichern
last_focus = lb.focus_get()
# Focus nur auf die Listbox legen
lb.focus_set()
# Scrollen
if event.num == 5 or event.keycode == -120:
lb.yview_scroll(2, Tkinter.UNITS)
if event.num == 4 or event.keycode == 120:
lb.yview_scroll(-2, Tkinter.UNITS)
# Focus zurücklegen
last_focus.focus_set()
Wenn am Schluss der Focus wieder ins Textwidget gelegt wird, wird dies anschließend noch gescrollt! Als würde das Event erneut intern für das Textwidget aufgerufen?!
Kann mir das vielleicht jemand erklären bzw. weiss jemand ne Lösung wie man dies unterdrückt?

mfg,
Simon
PS: Python v2.2, TK v8.3