1

Glade (GTK+3) と Python を使用して、Ubuntu アプリにドロップダウン リストを実装しようとしています。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 hereと一致していました。

何も機能しません。コンボボックス ウィンドウを 2 回目に開くと、空白のウィンドウになります。誰でも助けてもらえますか?

4

2 に答える 2

1

私は解決策を見つけました。xボタンを使用してウィンドウを閉じていました。これは、ウィジェットとそれに関連付けられているリストストアを破壊していたに違いありません。代わりに、ウィンドウを非表示にするだけのカスタム ボタンを使用しています。

于 2013-04-16T22:20:04.037 に答える
0

タイトルには、「Glade / GTK+3 / Python の ComboBoxText...」と書かれており、GtkComboBoxText ではなく、GtkComboBox を実装しようとしています。GtkComboBox で自分を苦しめる必要はありません。

グレードファイル(スニペット)

<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
于 2014-11-21T15:35:19.150 に答える