Retrieve Tkinter listbox item by string, not by index
James Stroud
jstroud at mbi.ucla.edu
Fri Dec 22 20:55:16 EST 2006
Kevin Walzer wrote:
> I'm trying to set the active item in a Tkinter listbox to my
> application's currently-defined default font.
>
> Here's how I get the fonts loaded into the listbox:
>
> self.fonts=list(tkFont.families())
> self.fonts.sort()
>
> for item in self.fonts:
> self.fontlist.insert(END, item) #self.fontlist is the
> ListBox instance
>
>
> So far, so good. But I don't know how to set the active selection in the
> listbox to the default font. All the methods for getting or setting a
> selection in the listbox are based on index, not a string. And using
> standard list search methods like this:
>
> if "Courier" in self.fontlist:
> print "list contains", value
> else:
> print value, "not found"
>
> returns an error:
>
> TypeError: cannot concatenate 'str' and 'int' objects
>
> So I'm stuck. Can someone point me in the right direction?
I would keep a separate data structure for the fonts and update the
scrollbar when the list changed. This would help to separate the
representation from the data represented. Here is a pattern I have found
most useful and easy to maintain:
# untested
class FontList(Frame):
def __init__(self, *args, **kwargs):
Frame.__init__(self, *args, **kwargs)
self.pack()
self.fonts = list(kwargs['fonts'])
self.default = self.fonts.index(kwargs['default_font'])
self.lb = Listbox(self)
# add scrollbar for self.lb, pack scrollbar
# pack self.lb
self.set_bindings()
self.update()
def set_bindings(self):
# put your bindings and behavior here for FontList components
def update(self):
self.lb.delete(0, END)
for f in self.fonts:
self.lb.insert(f)
self.highlight()
def highlight(self):
index = self.default
self.lb.see(index)
self.lb.select_clear()
self.lb.select_adjust(index)
self.lb.activate(index)
def change_font(self, fontname):
self.default = self.fonts.index(fontname)
self.highlight()
def add_font(self, fontname, index=None):
if index is None:
self.fonts.append(fontname)
else:
self.fonts.insert(index, fontname)
self.update()
# other methods for adding multiple fonts or removing them, etc.
--
James Stroud
UCLA-DOE Institute for Genomics and Proteomics
Box 951570
Los Angeles, CA 90095
http://www.jamesstroud.com/
More information about the Python-list
mailing list