2017-07-02 2 views
-1

J'ai trouvé SysTrayIcon.py pour créer facilement une icône Systray dans Windows. Le problème est, il bloque la poursuite de l'exécution du code, à titre d'exemple, voici comment je crée mon trayicon actuelle:Systray bloquant davantage Exécution du code

import _tray #This is a simple import of SysTrayIcon.py 

#Create SysTray 
def EXIT(self): None 
def DEBUG(self): print("TEST") 
def SHOW(self): print("Showing Main Window") 
HOVER = "Foo v"+version 
ICON = root+"apr.ico" 
MENUE =(('1', None, DEBUG), 
     ('2', None, SHOW), 
     ('Sub', None, (
      ('Sub 1', None, DEBUG), 
      ('Sub 2', None, DEBUG),))) 

_tray.SysTrayIcon(ICON, HOVER, MENUE, on_quit=EXIT, default_menu_index=1) 

si j'ajouter maintenant laisse dire ce code:

print("This get's executed after the Trayicon is quit.") 

à l'autre code, il ne sera pas exécuté jusqu'à ce que je quitte le Trayicon, comment puis-je éviter/corriger ce comportement?

Répondre

1

Vous pouvez utiliser des threads pour séparer le maintien du contexte de l'API WIN32 de la logique de votre application. Par exemple, si vous remplacez l'appel direct avec:

import threading 

def run_systray(icon, hover, menu, **options): 
    _tray.SysTrayIcon(icon, hover, menu, **options) 

thread = threading.Thread(target=run_systray, 
          args=(ICON, HOVER, MENUE), 
          kwargs={"on_quit": EXIT, "default_menu_index": 1}) 
thread.start() 

print("This gets executed immediately...") 

# you can do whatever you want here 

# in the end, lets cleanly handle the thread closing: 
thread.join() 

print("This gets executed only after systray exit...") 

la classe SysTrayIcon se fera un plaisir avec l'API WIN32 directement sans bloquer le reste du code jusqu'à ce que vous décidez de rejoindre le fil vers le principal.

+0

Exactement ce que je voulais, merci beaucoup! – Lyux