Не работает меню в трейе

Когда я запускаю код, всё работает кроме меню в QSystemTrayIcon.
Меню просто не открывается.

В файле main.py вницу цикл while в котором я проверяю комбинации клавиш. Если я запускаю работу трея, то мне нужно вызвать функцию app.exercise_(), которая тоже является цикличной функцией. И поэтому у меня не работает while с комбинациями клавиш. Я пробовал запускать трейлер в отдельном потоке, но это не помогло

Что сделать чтобы заработало?

main.py

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMenu
from PIL import ImageGrab, Image
import keyboard

import sys
import time
import os
import threading

from moduls.Snip import SnippingWidget
from moduls.ScreenOutput import Ui_Output_Ui
from moduls.TextRecognitor import text_recognition
from moduls.Translator import Translator
from moduls.Tray import SystemTray

class Tray(SystemTray): 
    def set_menu(self):
        menu = QMenu()

        exitAction = menu.addAction('Settings')
        exitAction.triggered.connect(self.exit)

        exitAction = menu.addAction('Exit')
        exitAction.triggered.connect(self.exit)

        self.setContextMenu(menu)
    
    def exit(self):
        quit()

def end_screen_shot():
    open_screen = True
    try:
        text = ' '.join(text_recognition(image_path))
        translated = Translator.google_translate(text, 'russian')
    except FileNotFoundError:
        translated = 'None'
        open_screen = False
        global first_screenshot
        first_screenshot = False
    
    try:
        img = Image.open(image_path)
        width, height = img.size
    except FileNotFoundError:
        width, height = 100, 100

    Output_Ui.setText(translated, 9)
    Output_Ui.resize(width, height)
    Output_Ui.move(snipper.img_x1, snipper.img_y1)

    if open_screen:
        Output_Ui.show()
    else:
        Output_Ui.close()

if __name__ == "__main__":
    image_path = './img/Image.png'
    bg_path = './img/bg.png'
    icon_path = './img/icon.png'

    app = QtWidgets.QApplication(sys.argv)
    Output_Ui = Ui_Output_Ui(icon_path)

    tray = Tray(QtGui.QIcon(icon_path), app, 'Test Name') # Здесь проблема
    tray.show()

    first_screenshot = False
    while True:
        time.sleep(0.1)

        if keyboard.is_pressed('alt+z'):
            snipper = SnippingWidget(image_path, bg_path, icon_path)
            snipper.closed.connect(end_screen_shot)
            
            first_screenshot = True

            snipper.showFullScreen()
            QtWidgets.QApplication.setOverrideCursor(QtCore.Qt.CrossCursor) # Изменяю курсор

            app.exec_()
        
        elif keyboard.is_pressed('alt+x') and first_screenshot:
            try:
                snipper.ScreenShot()
                end_screen_shot()
            except (ValueError, SystemError):
                if os.path.exists(image_path):
                    os.remove(image_path)
            app.exec_()

Tray.py

import sys
from PyQt5.QtWidgets import QApplication, QSystemTrayIcon, QMenu
from PyQt5.QtGui import QIcon

class SystemTray(QSystemTrayIcon):
    def __init__(self, icon_path, parent=None, name='Test'):
        QSystemTrayIcon.__init__(self, icon_path, parent)
        self.app = parent
        
        self.setToolTip(name)

        self.set_menu()
    
    def set_menu(self):
        menu = QMenu()
        exitAction = menu.addAction('Exit')
        exitAction.triggered.connect(self.exit)

        self.setContextMenu(menu)
    
    def exit(self):
        print('exit')

def main():
    app = QApplication(sys.argv)
    tray = SystemTray(QIcon('icon.png'), app)
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

Ответы (1 шт):

Автор решения: S. Nick

Я не понимаю что у вас написано в модуле main.py,
а в модуле Tray.py вам не хватает self.show()

void QSystemTrayIcon::show()

Показывает значок в системном трее.

import sys
from PyQt5.QtWidgets import QApplication, QSystemTrayIcon, QMenu,\
     qApp                                                               # + qApp
from PyQt5.QtGui import QIcon


class SystemTray(QSystemTrayIcon):
    def __init__(self, icon_path, parent=None, name='Test'):
        QSystemTrayIcon.__init__(self, icon_path, parent)
        self.app = parent
        self.setToolTip(name)

        self.set_menu()
    
    def set_menu(self):
        menu = QMenu()
        exitAction = menu.addAction('Exit')
        exitAction.triggered.connect(self.exit)
        self.setContextMenu(menu)
        
        self.show()                                               # +++
    
    def exit(self):
        print('exit')
        qApp.quit()                                               # +++


def main():
    app = QApplication(sys.argv)
    tray = SystemTray(QIcon('im.png'), app)
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка