pygtk получить виджет по имени из родительского узла - PullRequest
1 голос
/ 15 марта 2012

У меня есть виджет gtk, и я хочу выяснить, есть ли в его потомках другой виджет. Если он есть, я хочу вернуть его, в противном случае вернуть None. Это простая рекурсивная проблема, но я не могу найти правильный способ сделать это.

В XML-файле Glade у меня есть:

  <object class="GtkDialog" id="monkey">
  [...]
       <object class="GtkTreeView" id="ook">

и вызов find(my_monkey_object, 'ook') должны вернуть объект GtkTreeView. find() должно быть чем-то похожим на

def find (node, id):
    if node.XXX() == id: return node
    for child in node.get_children():
        ret = find(child, id)
        if ret: return ret
    return None

Я не уверен, какой метод XXX () мне нужно использовать. get_name() выглядел обнадеживающим, но возвращает имя класса объекта, а не его "id". Я использую версию Pygtk-2.24.

См. Этот Python GTK + имя виджета вопрос для той же проблемы.

Обратите внимание, что эта ошибка в некотором роде объясняет проблему: я хочу, чтобы идентификатор компоновщика был из дерева виджетов GTK. К сожалению, это кажется невозможным получить ...

Ответы [ 3 ]

5 голосов
/ 21 марта 2012

Согласно документации gtk C-api, вы можете получить имя "id" поляны, например:

name = gtk_buildable_get_name (GTK_BUILDABLE (widget))

Для pygtk это то же самое, что и

name = gtk.Buildable.get_name(widget)
1 голос
/ 15 марта 2012

Я полагаю, ваш объект узла является производным классом gtk.Container. Может быть, isinstance(node, gtk.TreeView) это то, что вы ищете. По сути, в подклассах gtk.Widget нет ни одного «идентификатора». Поле id принадлежит парсеру glade-xml.

Могу ли я предложить что-то вроде:

def find_child_classes(container, cls):
    return [widget for widget in container.get_children() if isinstance(widget, cls)]

Или вы сохраняете объект-строитель и обращаетесь к экземпляру: builder.get_object('your-object-id').

0 голосов
/ 15 января 2017

Этот ответ имеет его.

Адаптирован для использования pygi, выглядит так:

# Copypasta from https://stackoverflow.com/a/20461465/2015768
# http://cdn.php-gtk.eu/cdn/farfuture/riUt0TzlozMVQuwGBNNJsaPujRQ4uIYXc8SWdgbgiYY/mtime:1368022411/sites/php-gtk.eu/files/gtk-php-get-child-widget-by-name.php__0.txt
# note get_name() vs gtk.Buildable.get_name(): /3895806/python-gtk-imya-vidzheta
def get_descendant(widget, child_name, level, doPrint=False):
  if widget is not None:
    if doPrint: print("-"*level + ": " + (Gtk.Buildable.get_name(widget) or "(None)") + " :: " + (widget.get_name() or "(None)"))
  else:
    if doPrint:  print("-"*level + ": " + "None")
    return None
  #/*** If it is what we are looking for ***/
  if(Gtk.Buildable.get_name(widget) == child_name): # not widget.get_name() !
    return widget;
  #/*** If this widget has one child only search its child ***/
  if (hasattr(widget, 'get_child') and callable(getattr(widget, 'get_child')) and child_name != ""):
    child = widget.get_child()
    if child is not None:
      return get_descendant(child, child_name,level+1,doPrint)
  # /*** Ity might have many children, so search them ***/
  elif (hasattr(widget, 'get_children') and callable(getattr(widget, 'get_children')) and child_name !=""):
    children = widget.get_children()
    # /*** For each child ***/
    found = None
    for child in children:
      if child is not None:
        found = get_descendant(child, child_name,level+1,doPrint) # //search the child
        if found: return found
...