Search code examples
pythonlinuxgtkgnomepygobject

Blank window when lanching about dialogue twice?


I have an application design done, without any useful stuff happening, but I have two windows. One is the main window, and one is the about dialogue. They are all on one .ui file from Glade.

When I open the About dialogue using Help>About (in my program), everything works. Closing it and opening it again using the same method results in a blank window.

Here is my code:

#! /usr/bin/env python3

from gi.repository import Gtk

class window():
    def __init__(self):
        self.builder = Gtk.Builder()

        self.builder.add_from_file("./personalinfo.ui")

        self.mainWindow = self.builder.get_object("mainWindow")

        self.mainWindow.connect("destroy", self.on_mainWindow_destroy)

        self.mainWindow.set_title("Persona")

        self.mainWindowMainBoxButtonBoxCancel = self.builder.get_object("mainWindowMainBoxButtonBoxCancel")

        self.mainWindowMainBoxButtonBoxCancel.connect("clicked", self.on_mainWindowMainBoxButtonBoxCancel_clicked)

        self.mainWindowMainBoxButtonBoxOK = self.builder.get_object("mainWindowMainBoxButtonBoxOK")

        self.mainWindowMainBoxButtonBoxOK.connect("clicked", self.on_mainWindowMainBoxButtonBoxOK_clicked)

        self.mainWindowMainBoxGenderBoxCombo  = self.builder.get_object("mainWindowMainBoxGenderBoxCombo")

        self.mainWindowMainBoxGenderBoxCombo.set_active(0)

        self.mainWindowMainBoxMenuFileMenuQuit = self.builder.get_object("mainWindowMainBoxMenuFileMenuQuit")

        self.mainWindowMainBoxMenuFileMenuQuit.connect("activate", self.on_mainWindowMainBoxMenuFileMenuQuit_activate)

        self.mainWindowMainBoxMenuHelpMenuAbout = self.builder.get_object("mainWindowMainBoxMenuHelpMenuAbout")

        self.mainWindowMainBoxMenuHelpMenuAbout.connect("activate", self.on_mainWindowMainBoxMenuHelpMenuAbout_activate)

        self.mainWindow.show_all()

    def on_mainWindow_destroy(self, widget):
        print("destroy: 'mainWindow'")

        Gtk.main_quit()

    def on_mainWindowMainBoxButtonBoxCancel_clicked(self, widget):
        print("clicked: 'mainWindowMainBoxButtonBoxCancel'")

        Gtk.main_quit()

    def on_mainWindowMainBoxButtonBoxOK_clicked(self, widget):
        print("clicked: 'mainWindowMainBoxButtonBoxOK'")

        Gtk.main_quit()

    def on_mainWindowMainBoxMenuFileMenuQuit_activate(self, widget):
        print("activate: 'mainWindowMainBoxMenuFileMenuQuit'")

        Gtk.main_quit()

    def on_mainWindowMainBoxMenuHelpMenuAbout_activate(self, widget):
        print("activate: 'mainWindowMainBoxMenuHelpMenuAbout'")

        self.aboutWindow = self.builder.get_object("aboutWindow")

        self.aboutWindow.set_title("About Persona")

        self.aboutWindowMainBoxButtonBoxOK = self.builder.get_object("aboutWindowMainBoxButtonBoxOK")

        self.aboutWindowMainBoxButtonBoxOK.connect("clicked", self.on_aboutWindowMainBoxButtonBoxOK_clicked)

        self.aboutWindow.show_all()

    def on_aboutWindowMainBoxButtonBoxOK_clicked(self, widget):
        print("clicked: 'aboutWindowMainBoxButtonBoxOK'")

        self.aboutWindow.destroy()

w = window()

Gtk.main()

Solution

  • The About window isn't created each time you call self.aboutWindow = self.builder.get_object("aboutWindow") it is created once when you load the UI file. So when you call self.aboutWindow.destroy() it destroys it forever, and the next time you try to display the window it no longer exists.

    Instead of destroying the window, you probably want to hide it instead self.aboutWindow.hide()