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