Listbox selection & events

Fragen zu Tkinter.
Antworten
Aydan
User
Beiträge: 13
Registriert: Mittwoch 24. Mai 2006, 13:08

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
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Es gibt tatsächlich ein Event KeyRelease.
Also: <KeyRelease-space>
Aydan
User
Beiträge: 13
Registriert: Mittwoch 24. Mai 2006, 13:08

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?
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

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.
Aydan
User
Beiträge: 13
Registriert: Mittwoch 24. Mai 2006, 13:08

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'
Antworten