ComboBoxText в Glade / GTK+3 / Python — исчезает при отображении во второй раз

Я пытаюсь реализовать раскрывающийся список в приложении Ubuntu, используя Glade (GTK+3) и Python. Я могу заставить ComboBoxText отображаться, заполненный строками. Однако, когда я закрываю окно, в котором оно содержится, а затем снова открываю его, выпадающего списка там нет, просто совершенно пустое окно.

Я добавил рассматриваемый виджет ComboBoxText в окно в Glade. Затем я добавил этот код в свою программу Python:

def on_button_edit_clicked(self, widget):
    """ display list of events already stored, and allow deletion """   

    self.combo = self.builder.get_object('combo_box')
    self.store = Gtk.ListStore(str)

    self.store.append(['hello'])
    self.store.append(['goodbye'])
    self.combo.set_model(self.store)

    event_editor = self.builder.get_object("event_editor")
    event_editor.show() 

Я даже пытался уничтожить виджет, чтобы посмотреть, поможет ли это:

def on_event_editor_destroy(self, widget):
    self.combo.destroy()
    self.store = Gtk.ListStore(str)
    self.combo.set_model(self.store)

РЕДАКТИРОВАТЬ:

С тех пор я пробовал альтернативный код, который включал объект CellRendererText, но все равно не повезло.

Вот мои исходники: я создал Gtk.ListStore (), затем я создал файл Gtk. CellRendererText(), затем я создал Gtk.ComboBox (). Все это соответствовало примеру 13.3 здесь.

Ничего не работает. Когда я открываю окно со списком во второй раз, это просто пустое окно. Кто-нибудь может помочь, пожалуйста?


person Jon Hudson    schedule 15.04.2013    source источник
comment
Вы перезаписываете .combo, .store и т. д. каждый раз, когда редактируете. Не знаю, проблема ли в этом, но это нехорошо. Лучше делать это в __init__ и показывать/скрывать по мере необходимости.   -  person ergosys    schedule 16.04.2013
comment
ergosis, спасибо. Я переместил это в метод 'init'. К сожалению, это не решило проблему.   -  person Jon Hudson    schedule 16.04.2013


Ответы (2)


Я нашел решение. Я закрывал окно с помощью кнопки x, которая, должно быть, уничтожала виджет и связанное с ним хранилище списков. Вместо этого я теперь использую пользовательскую кнопку, которая просто скрывает окно.

person Jon Hudson    schedule 16.04.2013

В заголовке говорится: «ComboBoxText в Glade/GTK+3/Python…», тогда вы пытаетесь реализовать GtkComboBox, а не GtkComboBoxText. Зачем мучить себя GtkComboBox.

Файл Glade (фрагмент)

<object class="GtkComboBoxText" id="comboboxtextEventEditor">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <property name="halign">end</property>
    <property name="margin_right">10</property>
    <property name="hexpand">True</property>
    <property name="entry_text_column">0</property>
    <property name="id_column">1</property>
    <signal name="changed" handler="on_changed_event_editor" swapped="no"/>
</object>

Обратите внимание, что для GtkComboBoxText не требуется GtkListStore. Теперь некоторые методы класса

from __future__ import print_function
from gi.repository import Gtk
import os

def TheClass(Gtk.ApplicationWindow):
    #class variable
    UI_FILE = "preference.glade"

    @staticmethod
    def get_id():
        return "windowTheClass"

    def __init__(self, app):
        """ Constructor"""
        # Initialize class variables.
        #app is an instance of a class which extends Gtk.Application
        #Hardcode to have a working example code
        self.ui_path = os.path.join("home", "useraccount", "Documents", "example")
        #self.app = app
        #self.ui_path = self.app.ui_path
        # Load ui
        self.__load_ui()
        self.__initialize_event_editor_combobox()

    def __load_ui(self):
        self.builder = Gtk.Builder()
        try:
            strUIFile = os.path.join(self.ui_path, self.UI_FILE)
            self.builder.add_from_file( strUIFile )
            del strUIFile
            self.win = self.builder.get_object( self.__class__.get_id() )
            # This is not useful until Gtk version 3.6
            #self.app.add_window(self.win)
            self.builder.connect_signals(self)
        except:
            print(self.__class__.__name__ + ".__load_ui error",  sys.exc_info()[1])

    def __initialize_event_editor_combobox(self):
        """ Populate event editor comboboxtext"""
        combobox = self.builder.get_object("comboboxtextEventEditor")
        combobox.remove_all()
        # Args [position, id, text]
        combobox.insert(0,"0", "Hello")
        combobox.insert(0,"1", "goodbye")
        combobox.set_active_id("1")
        del combobox

    def on_changed_event(self, widget, data=None):
        """ combobox value selected. Refresh combobox"""
        strSelectedEntry = widget.get_active_text()
        print(self.__class__.__name__ + ".on_changed_event", strSelectedEntry)
        #self.initialize_something_else(strSelectedEntry)
        del strSelectedEntry
person faulkmore    schedule 21.11.2014