как показать параметры при создании класса и наследования из Gtk.ComboBox - PullRequest
0 голосов
/ 28 февраля 2020

Я создал класс с именем Combo и наследование от Gtk.ComboBox в GtkClass.py:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

class Combo(Gtk.ComboBox):

    def __init__(self,opt):
        Gtk.ComboBox.__init__(self)
        self.options = opt
        self.set()

    def set(self):
        self.id_kitchen_list = Gtk.ListStore(str)
        for item in self.options:
            self.id_kitchen_list.append([item])

        self.id_kit_combobox = Gtk.ComboBox.new_with_model(self.id_kitchen_list)
        renderer_text = Gtk.CellRendererText()
        self.id_kit_combobox.pack_start(renderer_text, True)
        self.id_kit_combobox.add_attribute(renderer_text, "text", 0)
        return self.id_kit_combobox

, когда я использую этот класс в моем файле main.py:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

from GtkClass import Combo
class Assistant(Gtk.Assistant):
    def __init__(self):
        Gtk.Assistant.__init__(self)
        self.set_title("Assistant")
        self.set_default_size(600, -1)

        box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        self.append_page(box)
        self.set_page_type(box, Gtk.AssistantPageType.INTRO)
        self.set_page_title(box, "Page 1: Kitchen")

        grid = Gtk.Grid()
        grid.set_row_spacing(10)
        grid.set_column_spacing(10)

        self.id_kit_combobox = Combo(["1", "2", "3", "4", "5"])
        grid.attach(self.id_kit_combobox, 1, 0, 1, 1)

        box.pack_start(grid, True, True, 0)
        self.set_page_complete(box, True)

assistant = Assistant()
assistant.show_all()

Gtk.main()

ComboBox создает, но не показывает опций, когда я нажимаю на него!

enter image description here enter image description here

1 Ответ

1 голос
/ 28 февраля 2020

Вопрос : class inheritance из Gtk.ComboBox

Сначала я хочу показать, что не так с вашей реализацией.

class Combo(Gtk.ComboBox):

    def __init__(self,opt):
  1. Здесь вы __init__ inherieted Gtk.ComboBox, но вы не передали свой model=. Поэтому вы получаете ComboBox с моделью по умолчанию.
        Gtk.ComboBox.__init__(self)
        ...
    
  2. Здесь вы создаете экземпляр ListStore, который хотите использовать, но не .set... this ListStore для уже созданного экземпляра self объекта типа Gtk.ComboBox.
    Поэтому добавленные параметры никогда не отображаются.
    def set(self):
        self.id_kitchen_list = Gtk.ListStore(str)
        for item in self.options:
            self.id_kitchen_list.append([item])
    
  3. Здесь вы создаете новый объект типа Gtk.ComboBox, который приводит к ComboBox в ComboBox. Этот внутренний ComboBox никогда не появится.
        self.id_kit_combobox = Gtk.ComboBox.new_with_model(self.id_kitchen_list)
        ...
    
  4. Здесь вы возвращаете объект, который никогда не используется из вызывающего self.set().
        return self.id_kit_combobox
    

Решение :

class Combo(Gtk.ComboBox):
    def __init__(self, opt):
        self.id_kitchen_list = Gtk.ListStore(str)
        Gtk.ComboBox.__init__(self, model=self.id_kitchen_list)

        for item in opt:
            self.id_kitchen_list.append([item])

        renderer_text = Gtk.CellRendererText()
        self.pack_start(renderer_text, True)
        self.add_attribute(renderer_text, "text", 0)
...