Как я могу создать класс Python, который берет его определение из Gtk Builder

Я сделал все свое определение графического интерфейса на поляне, я использую PyGObject с python 2.7. Я сделал несколько виджетов с идентификаторами, и я могу получить эти объекты, вызвав соответствующий идентификатор, сейчас я делаю что-то вроде этого:

class MLPNotebookTab:
    def __init__(self):
        builder = Gtk.Builder.new_from_file(UI_FILE)
        builder.connect_signals(self)
        self.notebook = builder.get_object('MLPNotebook')

    def add_tab(self, content):
        pages = self.notebook.get_n_pages()
        label = "MLP #" + str(pages + 1)
        tab = NotebookTabLabel(label, self.notebook, pages + 1)
        self.notebook.append_page(content, tab.header)

    def on_btn_add_tab_clicked(self, button):
        self.add_tab(Gtk.Label(label= "test"))

Определение файла пользовательского интерфейса точно такое же, как и было бы, это просто блокнот. Я хочу сделать класс самой записной книжкой и предварительно загрузить другие атрибуты, которые мы установили в файле пользовательского интерфейса. Я нашел здесь какую-то реализацию: https://eeperry.wordpress.com/2013/01/05/pygtk-new-style-python-class-using-builder/

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import gtk, sys, os

class MainWindow(gtk.Window):
    __gtype_name__ = "MainWindow"

    def __new__(cls):
        """This method creates and binds the builder window to class.

        In order for this to work correctly, the class of the main
        window in the Glade UI file must be the same as the name of
        this class."""
        app_path = os.path.dirname(__file__)
        try:
            builder = gtk.Builder()
            builder.add_from_file(os.path.join(app_path, "main.ui"))
        except:
            print "Failed to load XML GUI file main.ui"
            sys.exit(1)
        new_object = builder.get_object('window')
        new_object.finish_initializing(builder)
        return new_object

    def finish_initializing(self, builder):
        """Treat this as the __init__() method.

        Arguments pass in must be passed from __new__()."""
        builder.connect_signals(self)

        # Add any other initialization here

Я не знаю, лучший ли это способ сделать это. Пожалуйста помоги!


person Kevin Cando    schedule 07.08.2017    source источник


Ответы (1)


Вы можете использовать эту стороннюю библиотеку (просто скопируйте в дерево): https://github.com/virtuald/pygi-composite-templates

И это будет выглядеть так:

from gi.repository import Gtk
from gi_composites import GtkTemplate

PATH_TO_UI_FILE='foo'

@GtkTemplate(ui=PATH_TO_UI_FILE)
class MLPNotebook(Gtk.Notebook):
    __gtype_name__ = 'MLPNotebook'

    def __init__(self):
        Gtk.Notebook.__init__(self)
        self.init_template()

С вашим файлом пользовательского интерфейса, содержащим виджет шаблона:

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <template class="MLPNotebook" parent="GtkNotebook">
    <!-- Stuff goes here -->
  </template>
</interface>

Обратите внимание, что блокнот был просто случайным примером, основанным на имени вашего виджета, который, вероятно, не имеет смысла по сравнению с другим типом виджета.

person TingPing    schedule 07.08.2017