Seite 1 von 1

Listbox selection & events

Verfasst: Mittwoch 28. Juni 2006, 16:16
von Aydan
Hi Leute,

ich habe eine Listbox im multiple modus und habe die Events <Button-1> und <space> gebunden. Ich verwalte damit eine liste der selektierten einträge um andere anzeigen upzudaten.
Jetzt ist es aber so, dass der handler vor dem selektieren eines elements zu laufen scheint, wobei die currselection die letzte änderung nicht beinhaltet. ich bekomm die letzte änderung der selektion also immer erst beim nächsten event mit. Bei <Button-1> ist die lösung einfach, ich verwende jetzt <ButtonRelease-1>. Gibt es auch ein <KeyRelease> oder eine andere möglichkeit den handler nach änderung der selektion auszuführen?

CU
Aydan

Verfasst: Mittwoch 28. Juni 2006, 19:44
von HWK
Es gibt tatsächlich ein Event KeyRelease.
Also: <KeyRelease-space>

Verfasst: Donnerstag 29. Juni 2006, 08:56
von Aydan
Danke,

das war genau das was ich brauchte.

Jetzt hab ich grad noch ein anderes Problem. Kann ich die default bindings so modifizieren, dass in multiple modus mit doppelklick selektieren/deselektieren kann und mit einfach klick den cursor versetzen?

Verfasst: Freitag 30. Juni 2006, 12:47
von HWK
Das sollte wohl möglich sein. Schau dir hierzu mal die Datei 'python24\tcl\tk8.4\listbox.tcl' (Auf Deinem Rechner vielleicht ein etwas anderer Pfad) an. Man müsste sich dazu aber mit tcl auskennen.
Viel Glück dabei.

Verfasst: Montag 3. Juli 2006, 10:48
von Aydan
Mittlerweile hab ich das mit dem rebinding hinbekommen, allerdings funktionierts noch nicht ganz so toll. Wenn ich im MULTIPLE Modus runtergescrollt habe und dann auf einen Eintrag klicke, dann springt sie Anzeige ganz nach oben.

Hier der Code:

Code: Alles auswählen

from Tkinter import *

class MyListbox(Listbox):
  def __init__(self,master=None,cnf={},**kw):
    apply(Listbox.__init__,(self,master),kw)
    #rebind events
    self.bind('<Button-1>',self._Button1)
    self.bind('<Double-Button-1>',self._Doublebutton1)
  def _Button1(self,event):
    #print(dir(event))
    mode=event.widget['selectmode']
    if mode==MULTIPLE:
      index=event.widget.index('@%d,%d'%(event.x,event.y))
      pos=event.widget.yview()[0]
      print 'pos=',pos
      event.widget.activate(index)
      #hier versuche ich den aktuell geklickten index sichtbar zu machen
      #event.widget.see(index)
      event.widget.after(100,event.widget.yview,'moveto',pos)
      return 'break'
  def _Doublebutton1(self,event):
    mode=event.widget['selectmode']
    if mode==MULTIPLE:
      i=event.widget.index('@%d,%d'%(event.x,event.y))
      if event.widget.select_includes(i):
        event.widget.selection_clear(i)
      else:
        event.widget.selection_set(i)
      return 'break'