Проблема с функцией при использовании QApplication

Angry

Новичок
Пользователь
Ноя 26, 2024
4
0
1
Добрый день!
Подскажите, пожалуйста, что делаю не так при переносе части кода в метод.
Если же метод init разворачиваю в основной код то работает.
Суть в том что при запуске приложения в трее создается иконка при щелчке правой кнопкой мыши открывается меню и командой завершения работы.

Python:
import sys
from PyQt5.QtWidgets import QApplication, QSystemTrayIcon, QMenu, QAction, QStyle
def init():
    # Создаем иконку для трея
    tray_icon = QSystemTrayIcon()
    tray_icon.setIcon(app.style().standardIcon(QStyle.SP_ComputerIcon))
    # Создаем контекстное меню для иконки
    menu = QMenu()
    # Действие для выхода из приложения
    exit_action = QAction("Exit")
    exit_action.triggered.connect(quit)
    # Добавляем действия в меню
    menu.addAction(exit_action)
    # Устанавливаем контекстное меню для иконки
    tray_icon.setContextMenu(menu)
    # Показываем иконку в трее
    tray_icon.show()
def quit(self):
    #"""Закрыть приложение"""
    self.app.quit()
# Создаем объект приложения
app = QApplication(sys.argv)
init()
# Запускаем цикл обработки событий приложения
sys.exit(app.exec_())
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 668
475
83
init вызвать перед объявлением app
 

Angry

Новичок
Пользователь
Ноя 26, 2024
4
0
1
Нет, так не работает.

Код:
Exception ignored on threading shutdown:
Traceback (most recent call last):
  File "C:\Users\Soft-\AppData\Local\Programs\Python\Python313\Lib\threading.py", line 1524, in _shutdown
    if _main_thread._handle.is_done() and _is_main_interpreter():
SystemError: <method 'is_done' of '_thread._ThreadHandle' objects> returned a result with an exception set

Еще раз отмечу, если я код формирования иконки переношу в основную программу, то все работает.
Python:
import sys
from PyQt5.QtWidgets import QApplication, QSystemTrayIcon, QMenu, QAction, QStyle
def quit(self):
    #"""Закрыть приложение"""
    self.app.quit()
# Создаем объект приложения
app = QApplication(sys.argv)
#---------------------------------------
#      то, что было в init
# Создаем иконку для трея
tray_icon = QSystemTrayIcon()
tray_icon.setIcon(app.style().standardIcon(QStyle.SP_ComputerIcon))
# Создаем контекстное меню для иконки
menu = QMenu()
# Действие для выхода из приложения
exit_action = QAction("Exit")
exit_action.triggered.connect(quit)
# Добавляем действия в меню
menu.addAction(exit_action)
# Устанавливаем контекстное меню для иконки
tray_icon.setContextMenu(menu)
# Показываем иконку в трее
tray_icon.show()
#---------------------------------------
# Запускаем цикл обработки событий приложения
sys.exit(app.exec_())
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 668
475
83
Python:
def quit(self):
    #"""Закрыть приложение"""
    self.app.quit()

зачем вам параметр self здесь?

наверное взяли отсюда? - https://evileg.com/ru/post/68/

qt - это ооп фреймворк
 

Angry

Новичок
Пользователь
Ноя 26, 2024
4
0
1
зачем вам параметр self здесь?
Это же событие. Мне же нужно как-т ссылку на приложение получить.
qt - это ооп фреймворк
Да ладно... а я то думаю что за слова такие новые class и что тут все через точку написано.... Мне что для вопроса надо все приложение сюда выкладывать? Я локализовал проблему, сделал минимальный пример в котором воспроизводится проблема, что бы его можно было за раз охватить.
Суть проблемы тут: не получается эту иконку сделать без формы. Если бы была главная форма, то с родителями не было бы проблем, как только делаешь главное окно - все так же нормализуется.
Нет, тут как раз с формой.
 

Angry

Новичок
Пользователь
Ноя 26, 2024
4
0
1
Разобрался сам. Если вдруг кому понадобиться. Нужно обратить внимание на родителя и чтобы объект не уничтожался его надо сохранить глобально.

Python:
import sys
from PyQt5.QtWidgets import QApplication, QSystemTrayIcon, QMenu, QAction, QStyle
def init():
    # Создаем иконку для трея
    tray_icon = QSystemTrayIcon()
    #Сохраняем объект иконки в объекте приложения
    app.tray_icon = tray_icon
    tray_icon.setIcon(app.style().standardIcon(QStyle.SP_ComputerIcon))
    # Создаем контекстное меню для иконки
    menu = QMenu()
    # Действие для выхода из приложения
    exit_action = QAction("Exit", app) #У действие родитель должен быть приложение
    exit_action.triggered.connect(quit)
    # Добавляем действия в меню
    menu.addAction(exit_action)
    # Устанавливаем контекстное меню для иконки
    tray_icon.setContextMenu(menu)
    # Показываем иконку в трее
    tray_icon.show()
def quit(self):
    #"""Закрыть приложение"""
    self.app.quit()
# Создаем объект приложения
app = QApplication(sys.argv)
init()
# Запускаем цикл обработки событий приложения
sys.exit(app.exec_())
 

Форум IT Специалистов