2017-04-27 5 views
1

Ich versuche, einen Text zu drucken, wenn im PyQT5-Programm auf das Taskleistensymbol geklickt wird. Ich habe versucht, das PyQT5 QSystemTrayIcon-aktivierte Signal (das beim Klicken auf das Taskleistensymbol angezeigt wird) mit der benutzerdefinierten Methode zu verbinden, aber die Methode wird nicht aufgerufen. Hier einfach Beispiel:PyQT5 QSystemTrayIcon aktiviertes Signal funktioniert nicht

import sys 
from PyQt5.QtWidgets import QSystemTrayIcon, QApplication 
from PyQt5.QtGui import QIcon 
from PyQt5.QtCore import pyqtSlot 


@pyqtSlot() 
def action(signal): 
    print('test1') 

app = QApplication(sys.argv) 
icon = QSystemTrayIcon(QIcon('any_icon.png'), app) 
icon.show() 

icon.activated.connect(action) 
#icon.activated['QSystemTrayIcon::ActivationReason'].connect(action) 
#icon.pyqtConfigure(activated=action) 

print(icon.receivers(icon.activated)) # to check if is connected 
sys.exit(app.exec_()) 

In Beispiel gibt 3 Möglichkeiten des Signals zu verbindenden Schlitz (zwei davon kommentiert). Ich habe versucht beide Methoden mit und ohne Dekorateur @pyqtSlot() zu verwenden. Verbindung verursacht keine Fehler. Sogar der Ausdruck von Signalempfängern sagt, dass er mit 1 Schlitz verbunden ist. Es wird jedoch nichts ausgeführt, wenn auf das Systray-Symbol geklickt wird.

Die Frage: Ist die Signalverbindung nicht korrekt, oder wird das Signal überhaupt nicht ausgegeben?

System: Ubuntu 16.04, PyQT5.8. Allerdings sollte auch an anderen Systemen gearbeitet werden, da PyQT Multiplattform-ish ist. PS: Ich habe official PyQT5 signal/slot documentation und viele verwandte Fragen zum Stapelüberlauf gelesen, aber das gleiche Problem nicht gefunden. Der nächste, den ich denke, kann sich beziehen is in C++, aber nicht auf Python. Irgendwelche Tipps würden wirklich geschätzt werden. Vielen Dank! Edit: festen Tippfehler in Text

+0

Ich habe es versucht und es funktioniert gut. Ich benutze Arch Linux, PyQt5.8, Qt5.8 und Gnome als Desktop-Manager. – eyllanesc

+0

@eyllanesc Vielen Dank für das Ausprobieren und detaillierte Informationen. Ich vergaß zu erwähnen, dass ich _Ubuntu_ mit _Unity_, nicht _Gnome_ habe, so dass mich zu einigen Tests führte und ich denke, dass es einen Fehler in _PyQT_ auf _Unity_. Mehr Informationen in meiner Antwort unten. –

Antwort

0

Basierend auf den Antworten von @Murdo und @eyllanesc habe ich den Beispielcode auf mehreren Systemen getestet. Clean Installation nur mit Python 3.5 und pip3 install pyqt5. System Tray-Icon aktiviert Signal ist:

Problem:

  • Ubuntu 16.04 - Unity, PyQt 5.8 und PyQt 5.5.1
  • Ubuntu 16.10 - Einheit, PyQt 5.8 und PyQt 5.7

Arbeits:

  • Ubuntu 16.04 - Gnome, PyQt 5,8
  • Arch Linux - Gnome, PyQt 5,8
  • Kubuntu 16.10, KDE, PyQt 5.7
  • Xubuntu - Openbox mit stalonetray

Es scheint, wie der Beispielcode richtig ist, und es gibt einen Fehler in PyQT mit Unity-QSystemTrayIcon nicht activated Signal sendet, wenn die System Tray-Symbol wird angeklickt. Ich werde den Bug nächste Woche am Flussufer melden.

SOLUTIONQSystemTrayIcon Aktivierung (angeklickt) Signal kann stattdessen durch die Zuweisung eines QMenu auf der Taskleiste und Detektieren QMenu().aboutToShow Signal umgangen werden. Auf diese Weise wird beim Anklicken des Tray-Symbols das Signal gesendet und das Menü angezeigt. Es ist nicht genau das gleiche Ergebnis, aber es scheint keine andere Möglichkeit zu geben, das Symbol des Symbols der Systemablage unter Unity zu erkennen. Danke an @Murdo für eine Idee. Einfaches Codebeispiel:

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


def action(): 
    print('System tray icon clicked.') 

app = QApplication(sys.argv) 
icon = QSystemTrayIcon(QIcon('any_icon.png'), parent=app) 
icon.show() 

menu = QMenu(parent=None) 
menu.aboutToShow.connect(action) 
icon.setContextMenu(menu) 

sys.exit(app.exec_()) 
+0

Ich habe das gleiche Problem mit PyQt 5.9 und Lubuntu 16.04 – sunyata

0

Ihr Beispiel funktioniert gut in Xubuntu unter openbox mit stalonetray. Allerdings in Xubuntu richtig funktioniert es nicht! Aber wenn ich so etwas hinzugefügt:

mNu = QMenu() 
test = QAction('Test',mNu) 
test.triggered.connect(action) 
icon.setContextMenu(mNu) 

es funktionierte in xubuntu. Ich denke, dass Ubuntu irgendwie nur erwartet, ein Menü in der Tray-Sache zu zeigen.

+0

Das Problem ist, ich muss die 'action()' aufrufen, wenn Systray-Symbol angeklickt wird, aber das obige Beispiel sendet Signal, wenn der Menüpunkt angeklickt wird. Die Tatsache, dass es auf _Xubuntu_ funktioniert, half mir beim Testen und Sie gaben mir eine Idee, wie zu umgehen Sie das Problem mit 'QMenu()' - mehr in meiner derzeit hinzugefügt Antwort. Vielen Dank! –

Verwandte Themen