Диалоги Gtk появляются только один раз

Я пишу приложение с графическим интерфейсом с помощью python и GTK (PyGobject). Вот мой класс приложения:

class Application(Gtk.Application):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, application_id='org.tractor.carburetor', **kwargs)
        self.window = None
        self.prefs = None
        self.about = None

    def do_startup(self):
        Gtk.Application.do_startup(self)

        action = Gio.SimpleAction.new('preferences', None)
        action.connect('activate', self.on_preferences)
        self.add_action(action)

        action = Gio.SimpleAction.new('about', None)
        action.connect('activate', self.on_about)
        self.add_action(action)

        action = Gio.SimpleAction.new("quit", None)
        action.connect('activate', self.on_quit)
        self.add_action(action)

    def do_activate(self):
        if not self.window:
            window = AppWindow(application=self) #GtkApplicationWindow
            self.window = window
        self.window.present()

    def on_preferences(self, action, param):
        if not self.prefs:
            prefs_window = ui.get('PreferencesWindow') #HdyPreferencesWindow
            prefs_window.set_transient_for(self.window)
            self.prefs = prefs_window
        self.prefs.show()

    def on_about(self, action, param):
        if not self.about:
            about_dialog = ui.get('AboutDialog') #GtkAboutDialog
            about_dialog.set_transient_for(self.window)
            self.about = about_dialog
        self.about.show()

    def on_quit(self, action, param):
        self.quit()

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

Вот ошибки:

(carburetor:157852): Gtk-CRITICAL **: 19:41:29.887: gtk_widget_show: assertion
'GTK_IS_WIDGET (widget)' failed
(carburetor:157852): Gtk-CRITICAL **: 19:41:29.887: gtk_label_set_markup:
assertion 'GTK_IS_LABEL (label)' failed
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
118
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно переопределить то, что происходит, когда они закрыты, чтобы они не были уничтожены, а вместо этого просто скрыли их. Вы можете сделать это, добавив обработчик событий в диалоги для события уничтожения, и просто выполните dialog_window.hide(), чтобы вы могли повторно отображать их, используя настоящее. Также не забудьте вернуть правильное логическое значение, чтобы подавить дальнейшее распространение события.

Мне удалось решить это для «о диалоге» с помощью «hide()», это зависит от «ответа» «run()». Но окно настроек не является диалоговым окном и не имеет метода «run()».

Danial Behzadi 19.12.2020 23:39

Поймал "delete-event" и определил его, чтобы скрыть окно. Хитрость заключалась в том, чтобы «вернуть True».

Danial Behzadi 20.12.2020 01:12

Другие вопросы по теме