Почему приложение GTK закрывается?

Я разрабатываю свою собственную служебную утилиту, изучая при этом Python3 и GTK для Linux, и столкнулся с проблемой. <br/> У меня есть следующий код: <br/> Приложение запускается и отображается в системном трее, а при нажатии на иконку приложения в трее открывается меню. Однако, когда я выбираю пункт меню "Open", окно с текстом "Hello world", которое должно открываться, не появляется, и приложение вместо этого закрывается. Как мне сделать так, чтобы окно открывалось, а само приложение продолжало работать? В чем может быть ошибка? <br/> Спасибо.
  • 11 сентября 2024 г. 18:13
Ответы на вопрос 2
Проблема, с которой вы столкнулись, может быть вызвана несколькими причинами. Важно гарантировать, что окно вашего приложения открывается и управляется правильно. Ниже приведены несколько рекомендаций и примеров кода для решения вашей проблемы:

1. **Проблемы с управлением окнами**: Если вы не сохраняете ссылку на созданное окно, оно может быть автоматически закрыто, как только теряет все ссылки на себя. Убедитесь, что вы сохраняете ссылку на ваше окно в вашем основном классе или в глобальной области видимости.

2. **Избегайте повторного создания окна**: Если окно уже открыто, лучше просто показать его, вместо создания нового экземпляра.

3. **Используйте обработчики событий правильно**: Убедитесь, что вы правильно обрабатываете события и сохраняете все ссылки на виджеты.

Вот пример, как можно организовать код для открытия окна:

```python
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk

class MyApp:
    def __init__(self):
        # Создаем основное окно
        self.window = Gtk.Window(title="Hello World")
        self.window.set_default_size(200, 100)
        
        label = Gtk.Label(label="Hello, World!")
        self.window.add(label)

        # Присоединяем сигнал к закрытию окна
        self.window.connect("destroy", Gtk.main_quit)

        # Создаем иконку в системном трее
        self.tray_icon = Gtk.StatusIcon()
        self.tray_icon.set_from_icon_name("application-x-executable")  # Укажите ваш иконку
        self.tray_icon.connect("popup-menu", self.on_tray_icon_right_click)
        self.tray_icon.connect("activate", self.on_tray_icon_click)

        self.window_visible = False  # Состояние окна

    def on_tray_icon_click(self, icon):
        if not self.window_visible:
            self.window.show_all()
            self.window_visible = True

    def on_tray_icon_right_click(self, icon, button, time):
        menu = Gtk.Menu()
        
        item_open = Gtk.MenuItem(label="Open")
        item_open.connect("activate", self.on_open)
        menu.append(item_open)

        item_quit = Gtk.MenuItem(label="Quit")
        item_quit.connect("activate", self.on_quit)
        menu.append(item_quit)

        menu.show_all()
        menu.popup(None, None, None, button, time)

    def on_open(self, widget):
        if not self.window_visible:
            self.window.show_all()
            self.window_visible = True

    def on_quit(self, widget):
        Gtk.main_quit()

    def run(self):
        Gtk.main()

if __name__ == "__main__":
    app = MyApp()
    app.run()
```

### Основные моменты:
- **Хранение состояния окна**: Мы используем `self.window_visible` для отслеживания состояния окна.
- **Правильное открытие окна**: Метод `on_open` проверяет состояние `self.window_visible` и только в случае, если окно не открыто — открывает его.
- **Убедитесь, что GTK правильно выполняется**: `Gtk.main()` завершает выполнение приложения, поэтому он должен оставаться на месте.

Используйте этот шаблон как основу и адаптируйте его под свои нужды. Также, если у вас есть стек вызовов, например, от `traceback`, это поможет диагностировать причину сбоя. Убедитесь, что ошибок в консоли при запуске приложения нет.
win = Gtk.ApplicationWindow(application=app)
что за переменная app ?

Изначально сделал так, заменив кусок
на
но были другие ошибки в работе, поэтому после их учета стало так:
Похожие вопросы