2010-02-03 3 views
1

Souvent, lorsque nous dessinons une interface graphique, nous voulons que notre interface graphique se mette à jour en fonction des changements de données dans notre programme. Au début du programme, disons que j'ai dessiné mon interface graphique en fonction de mes données initiales. Ces données vont changer constamment, alors comment puis-je redessiner mon interface graphique en permanence?Comment démarrer une "boucle de dessin" dans PyQt?

Répondre

0

Vous pouvez créer un thread pour mettre à jour l'interface graphique en permanence, juste passer à elle fait référence aux widgets graphiques qui doivent être mis à jour

+0

Cela semble plausible, pourriez-vous me montrer un exemple rapide peut-être? Les threads PyQt n'ont pas vraiment fonctionné pour moi et j'ai fini par utiliser QApplication.processEvents() – Chris

1

La meilleure façon que je l'ai trouvé pour ce faire est d'exécuter votre programme de base en un QThread et utilise des signaux pour communiquer avec votre interface graphique. Voici un exemple où je mets à jour une boîte de dialogue de progression car mon programme principal fait des choses.

Voici un extrait de code d'un projet sur lequel je travaillais. L'idée de base est que j'ajoute un certain nombre de fichiers à un objet de bibliothèque et que je mets à jour la progression au fur et à mesure que les fichiers sont ajoutés.

L'action est lancée par la classe Library. La bande de roulement qui fait le travail est dans le AddFilesThread. Faites-moi savoir si cela est utile.

Si vous avez besoin je peux essayer de mettre en place un exemple de travail au lieu d'un extrait de code.



Si vous voulez voir le code complet que j'aller ici: hystrix_library.py. La classe diaglog que j'ai utilisée est dans ce fichier. Je ne peux pas dire que c'est nécessairement la meilleure façon de faire les choses, mais cela fonctionne bien et est assez facile à lire.

class Library(QtCore.QObject): 
    """ 
    This class is used to store information on the libraries. 
    """ 
    def __init__(self): 
     QtCore.QObject.__init__(self) 

    def importUrls(self, url_list): 

     # Create a progress dialog 
     self.ui_progress = AddUrlsProgressDialog() 
     self.ui_progress.show() 
     self.ui_progress.raise_() 

     # Create the add files thread object. 
     self.add_files_thread = AddFilesThread() 

     # Connect the thread to the dialog. 
     self.connect(self.add_files_thread 
        ,QtCore.SIGNAL('updateDialog') 
        ,self.ui_progress.setDialog) 

     self.connect(self.add_files_thread 
        ,QtCore.SIGNAL('updateValue') 
        ,self.ui_progress.setValue) 

     self.connect(self.add_files_thread 
        ,QtCore.SIGNAL('finished') 
        ,self.ui_progress.setFinished) 

     self.connect(self.add_files_thread 
        ,QtCore.SIGNAL('canceled') 
        ,self.ui_progress.closeNow) 

     # Connect the dialog to the thread 
     self.connect(self.ui_progress 
        ,QtCore.SIGNAL('cancel') 
        ,self.add_files_thread.cancelRequest)   

     # Start the thread 
     self.add_files_thread.start() 




class AddFilesThread(QtCore.QThread): 

    def __init__(self, parent=None): 
     QtCore.QThread.__init__(self, parent) 

     self.cancel_request = False 

    def __del__(self): 
     self.wait() 

    def run(self): 
     try: 
      self.main() 
     except: 
      print 'AddFilesThread broke yo.' 
      self.cancelNow(force=True) 
      traceback.print_exc() 

    def main(self): 
     num_added = 0 
     for local_path in self.path_list: 
      # First Setup the dialog 
      status_label = 'Finding files to add . . .' 
      dialog_update = (status_label, (0,0), 0) 
      self.emit(QtCore.SIGNAL('updateDialog'), dialog_update) 

      # Do a recursive search. 
      all_files = hystrix_file.getFiles() 
      num_files = len(all_files) 

      if self.cancelNow(): 
       return 

      status_label = '%d files found.\nExtracting tags . . .' %(num_files) 
      dialog_update = (status_label, (0,num_files), 0) 
      self.emit(QtCore.SIGNAL('updateDialog'), dialog_update) 

      num_added = 0 
      for index, filename in enumerate(all_files): 
       try: 
        metadata = hystrix_tags.getMetadata(filename) 
        # Here I would add the metadata to my library. 
       except: 
        traceback.print_exc() 
        print('Could not extract Metadata from file.') 
        continue 

       # This should be sent to a progress widget 
       if index % 1 == 0: 
        self.emit(QtCore.SIGNAL('updateValue'), index) 

       # Check if a cancel signal has been recieved 
       if self.cancelNow(): 
        return 

     status_label = 'Finished. Added %d files.' %(num_added) 
     dialog_update = (status_label, (0,num_added), num_added) 
     self.emit(QtCore.SIGNAL('updateDialog'), dialog_update) 

     self.emit(QtCore.SIGNAL('finished')) 

    def cancelRequest(self): 
     self.cancel_request = True 

    def cancelNow(self, force=False): 
     if self.cancel_request or force: 
      self.emit(QtCore.SIGNAL('canceled')) 
      return True 
     else: 
      return False 
Questions connexes