Neuer Versuch:
Code: Alles auswählen
import Tkinter as tk
import random
def myfilter(e):
filterstr = filterfield.get()
if e.char in "0123456789": filterstr += e.char # VORSICHT!
for box in lboxes:
filteredcontent = [item for item in box.content if item.startswith(filterstr)]
box.delete(0,box.size())
box.insert("end",*filteredcontent)
def scroll_lboxes(*args):
for box in lboxes: box.yview(*args)
root = tk.Tk()
lboxframe = tk.Frame(root,padx=10,pady=10)
lboxframe.pack()
scroller = tk.Scrollbar(lboxframe,command=scroll_lboxes)
scroller.pack(side=tk.RIGHT,fill=tk.Y)
lboxes = list()
for n in range(3):
box = tk.Listbox(lboxframe,width=12,height=30,yscrollcommand=scroller.set)
box.pack(side=tk.LEFT)
box.content = [str(random.randint(10000000,99999999)) for k in xrange(100)]
box.insert("end",*box.content)
lboxes.append(box)
filterfield = tk.Entry(root)
filterfield.pack()
filterfield.focus_set()
filterfield.bind("<Any-KeyPress>",myfilter)
root.mainloop()
Das könnte ein Anfang sein, hat aber noch
Schwachstellen:
Hauptproblem ist, dass bei der Auswertung des Key-Events der Inhalt des Entry-Feldes noch nicht aktualisiert ist. Das habe ich nicht hinbekommen.
Ich habe es mit einem idle_update() probiert, mal eine kleine Wartezeit eingebaut, hat aber alles nicht geholfen.
Vielleicht gibt es jemanden mit mehr Erfahrung, der hierfür eine Lösung weiß.
Mögliche Notlösungen: Nach Eingabe einer Ziffer drückt man einmal <Enter>.
Dann muss Zeile 6 weg und eigentlich funktioniert es dann sauber.
Oder: Man lässt Zeile 6, müsste dann aber noch weitere Auswertungsarbeit leisten, um beim Einsatz der Cursortasten kombiniert mit <Del> oder <Backspace> noch die richtige Ziffernkombination zu erhalten.
Solange man nur eine Ziffer nach der anderen eingibt und ggf. mittels <Backspace> - mit einer Ziffer Verzögerung - wieder von rechts löscht, geht es auch so.
Nicht so angenehm zu bedienen, aber dafür immer mit korrekter Filterung wäre es, wenn die Filterung erst nach einem Buttonclick durchgeführt würde (der Button fehlt noch ...).
Entscheidend ist hier m.E. auch die Frage, ob es nur für den Eigenbrauch gedacht ist, oder ob auch andere mit dem Programm arbeiten sollen. Im letzteren Fall würde ich es, so wie es jetzt ist, NICHT lassen.