Не работает меню в трейе
Когда я запускаю код, всё работает кроме меню в 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()
Показывает значок в системном трее.
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()

