Имеется вот такой небольшой скрипт на питоне, показывающий значок в трее и выпадающее меню с запуском команд. Кое-что нарыл в сети, кое-что помог народ, сам я не умею, у меня лапки. Всё хорошо работает, но не устраивает маленький нюанс, По ПКМ меню вызывается над значком, а по ЛКМ меню вылазит в месте нажатия курсора на самом значке, что очень некрасиво. Можно это как-то поправить?
import sys
import subprocess
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QIcon
# code source: https://stackoverflow.com/questions/893984/pyqt-show-menu-in-a-system-tray-application - add answer PyQt5
#PyQt4 to PyQt5 version: https://stackoverflow.com/questions/20749819/pyqt5-failing-import-of-qtgui
class SystemTrayIcon(QtWidgets.QSystemTrayIcon):
def __init__(self, icon, parent=None):
QtWidgets.QSystemTrayIcon.__init__(self, icon, parent)
menu = QtWidgets.QMenu(parent)
runAction = menu.addAction("Жопа (c иконкой)") # 1 команда
runAction.setIcon(QIcon("/usr/share/icons/breeze-dark/applets/64/osd-rotate-flip.svg")) # 1 команда
runAction.triggered.connect(self.run) # 1 команда
exitAction = menu.addAction("Exit")
exitAction.triggered.connect(self.exit)
self.setContextMenu(menu)
self.activated.connect(self.showMenuOnTrigger)
def run(self): # 1 команда
subprocess.run(["/home/kot/bin/script/monitorbr0.sh"]) # 1 команда
def exit(self):
QtCore.QCoreApplication.exit()
def showMenuOnTrigger(self, reason):
if reason == QtWidgets.QSystemTrayIcon.Trigger:
self.contextMenu().popup(QtGui.QCursor.pos())
def main(image):
app = QtWidgets.QApplication(sys.argv)
w = QtWidgets.QWidget()
trayIcon = SystemTrayIcon(QtGui.QIcon(image), w)
trayIcon.show()
sys.exit(app.exec_())
if __name__ == '__main__':
on=r'/home/kot/bin/resurce/значки/tmp/arrow-49-48.png' # ADD PATH OF YOUR ICON HERE .png works
main(on)