Снова открыть окно с помощью PyGObject

Код:

<...>
class Handler:
    <...>
    @staticmethod
    def about_destroy(*args):
        about_win.destroy()
    <...>
    @staticmethod
    def about_menu(*args):
        about_win.show_all()

builder = Gtk.Builder()
builder.add_from_file("{}/gui.glade".format(SCRIPTDIR))
builder.connect_signals(Handler())

about_win = builder.get_object("About")

main = builder.get_object("Main")
main.show_all()
<...>
Gtk.main()

Я пытаюсь снова открыть окно, но получаю: (gui.py:20607):

Gtk-CRITICAL **: gtk_widget_show: утверждение «GTK_IS_WIDGET (виджет)» не удалось

(gui.py:20607): Gtk-CRITICAL **: gtk_label_set_markup: утверждение «GTK_IS_LABEL (метка)» не удалось

(gui.py:20607): Gtk-CRITICAL **: gtk_container_foreach: утверждение «GTK_IS_CONTAINER (контейнер)» не удалось

Диалоговое окно О программе:

  <object class="GtkAboutDialog" id="StatsAbout">
    <property name="can_focus">False</property>
    <property name="title">...name of the program...</property>
    <property name="resizable">False</property>
    <property name="window_position">center-on-parent</property>
    <property name="icon_name">..icon...</property>
    <property name="type_hint">dialog</property>
    <property name="has_resize_grip">False</property>
    <property name="program_name">...name of a program...</property>
    <property name="version">1.0</property>
<property name="version">1.0</property>
    <property name="copyright">...my name...</property>
    <property name="comments" translatable="yes">...description...</property>
    <property name="website">...my website...</property>
    <property name="website_label" translatable="yes">...name of a website...</property>
    <property name="license">...very long license...</property>
<property name="authors">...authors...</property>
    <property name="artists">...artists...</property>
    <property name="logo_icon_name">...icon...</property>
    <property name="wrap_license">True</property>
    <property name="license_type">custom</property>
    <signal name="close" handler="about_destroy" swapped="no"/>
    <signal name="destroy" handler="about_destroy" swapped="no"/>
    <signal name="response" handler="about_destroy" swapped="no"/>
    <child internal-child="vbox">
      <object class="GtkBox" id="AboutContainer">
        <property name="can_focus">False</property>
        <property name="orientation">vertical</property>
        <property name="spacing">2</property>
        <child internal-child="action_area">
          <object class="GtkButtonBox" id="AboutButtons">
            <property name="can_focus">False</property>
            <property name="layout_style">end</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="pack_type">end</property>
            <property name="position">0</property>
          </packing>
        </child>
          <placeholder/>
        </child>
      </object>
    </child>
  </object>

person Cyber Tailor    schedule 29.06.2015    source источник


Ответы (1)


Я решил свою проблему самостоятельно.

Сейчас я использую метод .hide() вместо .destroy(). Мой код:

<...>
class Handler:
    <...>
    @staticmethod
    def about_destroy(*args):
        about_win.hide()
    <...>
    @staticmethod
    def about_menu(*args):
        about_win.show_all()

builder = Gtk.Builder()
builder.add_from_file("{}/gui.glade".format(SCRIPTDIR))
builder.connect_signals(Handler())

about_win = builder.get_object("About")

main = builder.get_object("Main")
main.show_all()
<...>
Gtk.main()
person Cyber Tailor    schedule 30.06.2015