LINUX.ORG.RU

Скрипт на питоне

 , , ,


1

2

Имеется вот такой небольшой скрипт на питоне, показывающий значок в трее и выпадающее меню с запуском команд. Кое-что нарыл в сети, кое-что помог народ, сам я не умею, у меня лапки. Всё хорошо работает, но не устраивает маленький нюанс, По ПКМ меню вызывается над значком, а по ЛКМ меню вылазит в месте нажатия курсора на самом значке, что очень некрасиво. Можно это как-то поправить?

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)

★★

Последнее исправление: KOT040188 (всего исправлений: 1)

ну, очевидно что

QtGui.QCursor.pos()

для левой и правой кнопки разные

сделай в OnTrigger отладочный вывод и посмотри что там в координатах для левой и правой, если действительно разные координаты передаются, нужно добавить проверку какой кнопокой тапнули и пересчет координат если это был ЛКМ

vyv ★★★
()
Ответ на: комментарий от vyv

сделай в OnTrigger отладочный вывод

Да если бы я знал как, я ни разу не программист на среднем образовании изучали хелоуворлд и не больше. В скрипте я понял только как пункты меню добавлять и всё.

KOT040188 ★★
() автор топика

Тут неправильно трей настроен. Надо вот так:

self.tray.setContextMenu(menu)

И по пкм он менюха будет сама показываться. А то, что тут делается, используют для показа виджета по лкм:

self.tray.activated.connect(self._visible)
def _visible(self, reason):
    if reason == QSystemTrayIcon.Trigger:
        if self.isHidden():
            self.showNormal()
        else:
            self.setHidden(True)

Больше примеров кода pyqt5 можно посмотреть в моём DeWidgets.

InterVi ★★★★★
()