[pygtk] Ok. A new try...
Tim Evans
t.evans at aranz.com
Fri Mar 24 05:57:09 WST 2006
John Ehresman wrote:
> Gonzalo Aguilar Delgado wrote:
>> How do I find a widget (say a GtkEntry) inside it with the name
>> "txtbox"?
>
> You need to go through all the children and find the one with the name.
> Try the following:
>
> def all_descendants(w, flags=None):
> """ Generator to traverse all descendants of a widget in depth-first
> order. Assumes that the widget hierarchy doesn't change during the
> traversal. Use flags to only return widgets where widget & flags is
> true. If a widget is filtered out, all of its descendants are also
> filtered out. """
>
> if not isinstance(w, gtk.Container):
> return
>
> for child in w.get_children():
> if flags is None or child.flags() & flags:
> yield child
>
> for g_kid in all_descendants(child):
> yield g_kid
>
> def find_named(parent, name):
> for w in all_descendants(parent):
> if w.get_name() = name:
> return w
> return None
>
> entry = find_named(frame, 'txtbox')
>
> You probably do want to make sure that only one widget with the name
> 'txtbox' is a descendant of frame. gtk does not enforce this for you.
I generally prefer to avoid the recursion and use something like this:
def all_descendants(root):
stack = [root]
while stack:
w = stack.pop()
yield w
if isinstance(w, gtk.Container):
stack.extend(reversed(w.get_children()))
if isinstance(w, gtk.MenuItem):
submenu = w.get_submenu()
if submenu:
stack.append(submenu)
Submenus don't count as children but for most things it's useful to have
them listed in the same way. I would also recommend putting all the
widgets into a dictionary if you'll be doing these lookups often:
def named_widgets(root):
r = {}
for w in all_descendants(root):
name = w.get_name()
if name:
r[name] = w
return r
--
Tim Evans
Applied Research Associates NZ
http://www.aranz.co.nz/
More information about the pygtk
mailing list