2017-04-27 5 views
1

PyQT5プログラムでシステムトレイアイコンをクリックしたときにテキストを印刷しようとしています。私はPyQT5 QSystemTrayIcon(システムトレイのアイコンがクリックされたときに出力される)信号をカスタムメソッドに接続しようとしましたが、メソッドが呼び出されませんでした。ここ 簡単な例である:例でPyQT5 QSystemTrayIcon有効化信号が機能しない

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_()) 

スロットに信号を接続する3つの方法(それらの2コメント)です。デコレータ@pyqtSlot()の有無にかかわらずメソッドを使ってみました。接続でエラーが発生しません。信号受信機のプリントでさえ、1スロットに接続されていると言われています。ただし、システムトレイのアイコンをクリックしても何もしません。

質問:信号の接続が正しくない、または信号が全く放射されていませんか?

システム:Ubuntu 16.04、PyQT5.8。しかし、PyQTはマルチプラットフォームのように他のシステムでも動作するはずです。 PS:私はofficial PyQT5 signal/slot documentationとスタックオーバーフローに関する多くの関連する質問を読みましたが、同じ問題は見つかりませんでした。私が考える最も近いものはis in C++であるかもしれませんが、Pythonには当てはまりません。 ヒントは本当に感謝しています。どうもありがとうございました! 編集:テキストの入力ミスが修正されました

+0

私はそれを試してもうまくいきます。デスクトップマネージャーとして、Arch Linux、PyQt5.8、Qt5.8、gnomeを使用しています。 – eyllanesc

+0

@eyllanescお試しいただきありがとうございます。 _Ununt_ _を持つ_Ubuntu_、_Gnome_でない があることを忘れてしまったので、いくつかのテストにつながりました。_Unity_ _PyQT_にバグがあると思います。私の答えは以下の通りです。 –

答えて

0

@ Murdoと@eyllanescの回答に基づいて、複数のシステムでサンプルコードをテストしました。 Python 3.5およびpip3 install pyqt5でのクリーンインストールのみ。システムトレイのアイコン有効信号は、次のとおりです。動作しない

  • のUbuntu 16.04 - ユニティ、PyQtは5.8とPyQtは5.5.1
  • のUbuntu 16.10 - ユニティ、PyQtは5.8とPyQtは5.7

ワーキング:

  • Ubuntuの16.04 - Gnomeの、PyQtは5.8
  • アーチのLinux - Gnomeの、PyQtは5.8
  • Kubuntuの16.10、KDE、PyQtは5。7
  • のXubuntu - このOpenBoxとStalonetray

それは、サンプルコードが正しいように思えるとユニティ使用バグPyQtはあり - activated信号時に送信されませんQSystemTrayIconは、システムトレイアイコンがクリックされます。 来週のバグを川岸に報告します。

SOLUTIONQSystemTrayIcon活性化信号は、システムトレイアイコンにQMenuを割り当て、代わりQMenu().aboutToShow信号を検出することによってバイパスすることができる(クリック)。トレイアイコンをクリックすると、aboutToShowという信号が送信され、メニューが表示されます。まったく同じ結果ではありませんが、Unityで、システムトレイアイコンのアクティブ化を検出する他の方法はないようです。アイデアのために@ Murdoに感謝します。簡単なコード例:

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

私はPyQt 5.9とLubuntu 16.04で同じ問題を抱えています – sunyata

0

あなたの例は、openboxの下でXubuntuでstalonetrayを使ってうまく動作します。 しかし、Xubuntuでは正しく動作しませんでした! しかし、ときに私のようなものを追加しました:それはXubuntuの中で働いていた

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

を。私は何とかUbuntuがトレイのものにメニューを表示することしか期待していないようです。

+0

問題は、システムトレイのアイコンをクリックしたときに 'action()'を呼び出す必要がありますが、 上記の例では、メニュー項目をクリックするとシグナルが送信されます。しかし、_Xubuntu_ で動作しているので、テストで助けられました。 を使って問題を回避する方法を私に教えてくれました。どうもありがとうございました! –

関連する問題