2015-08-06 1 views
2

Je souhaite avoir une icône de barre d'état pour me dire si mon port COM est branché ou non. Il devrait changer toutes les 5 secondes en fonction de l'état du port COM. Je veux aussi la possibilité de tuer le programme en utilisant le menu contextuel de l'icône de la barre d'état. J'ai compris comment avoir le rafraîchissement ou le menu, mais je ne sais pas comment avoir les deux.Filetage pour l'application de l'icône de la barre d'état

import sys 
import glob 
import serial 
import time 
from PyQt4 import QtGui, QtCore 
import sys 
import threading 
from multiprocessing import Process, Queue 

#script needing python 3.4 , pyserial (via pip) and pyqt4 (via .exe available online) 
def serial_ports(): 

    if sys.platform.startswith('win'): 
     ports = ['COM' + str(i + 1) for i in range(256)] 


    result = [] 
    for port in ports: 
     try: 
      s = serial.Serial(port) 
      s.close() 
      result.append(port) 
     except (OSError, serial.SerialException): 
      pass 
    return result 


class SystemTrayIcon(QtGui.QSystemTrayIcon): 

    def __init__(self, icon, parent=None): 
     QtGui.QSystemTrayIcon.__init__(self, icon, parent) 
     menu = QtGui.QMenu(parent) 
     changeicon = menu.addAction("Update") 
     exitAction = menu.addAction("Exit") 
     self.setContextMenu(menu) 
     exitAction.triggered.connect(QtGui.qApp.quit) 
     changeicon.triggered.connect(self.updateIcon) 


    def updateIcon(self): 

     resultats = serial_ports() 
     icone = "red.ico" 
     for resultat in resultats: 
      if "COM3" in resultat: 
       icone = "green.ico" 
       break 

     self.setIcon(QtGui.QIcon(icone)) 
     #update the icon (its color) according to the content of "resultat" 

#missing code; purpose : wait 5 seconds while having the contextual menu of the tray icon still available 

def main(): 
    app = QtGui.QApplication(sys.argv) 

    w = QtGui.QWidget() 
    trayIcon = SystemTrayIcon(QtGui.QIcon("red.ico"), w) 
    #always starts with red icon 
    trayIcon.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 
+0

Vous pouvez essayer un 'QTimer' et peut-être éviter de filetage tout à fait. – 101

+0

Salut, j'ai du mal à l'implémenter, je suis venu avec ça jusqu'à maintenant: 'timer. = QtCore.QTimer() ' ' timer.timeout.connect (self.updateIcon) ' ' timer.start (5000) ' Je ne sais pas où le mettre ou comment je devrais" l'activer ". Bonne avance cependant. –

+0

nvm, j'ai découvert –

Répondre

0

trouvé à l'aide QTimer grâce à des figues, semble répétitif et ne comprenait pas tout, mais il fonctionne:

class SystemTrayIcon(QtGui.QSystemTrayIcon): 

    def __init__(self, icon, parent=None): 
     QtGui.QSystemTrayIcon.__init__(self, icon, parent) 
     menu = QtGui.QMenu(parent) 
     changeicon = menu.addAction("Update") 
     exitAction = menu.addAction("Exit") 
     self.setContextMenu(menu) 
     exitAction.triggered.connect(QtGui.qApp.quit) 
     changeicon.triggered.connect(self.updateIcon) 
     self.updateIcon() 

    def updateIcon(self): 
     try: 
      timer = QtCore.QTimer() 
      timer.timeout.connect(self.updateIcon) 
      timer.start(5000) 
      resultats = serial_ports() 
      icone = "red.ico" 
      for resultat in resultats: 
       if "COM3" in resultat: 
        icone = "green.ico" 
        break 

      self.setIcon(QtGui.QIcon(icone)) 

     finally: 
      QtCore.QTimer.singleShot(5000,self.updateIcon)