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
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
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
- 1. Comment utiliser le dessin personnalisé dans QGraphicsViews dans PyQt?
- 2. Comment décocher une case pour arrêter le dessin infini dans pyqt?
- 3. Débogage PyQt dans la boucle principale
- 4. comment démarrer une boucle for dans la programmation R
- 5. PyQt: Redéfinition QGraphicsView.drawItems
- 6. Comment obtenez-vous une interface graphique réactive si votre codebehind exécute une boucle infinie? PyQT
- 7. comment avoir une boîte de dialogue de répertoire dans Pyqt
- 8. Continuer à ne pas démarrer en boucle
- 9. Comment démarrer une activité
- 10. Ouvrir une seconde fenêtre dans PyQt
- 11. Comment démarrer ob_start dans une classe?
- 12. Glyphes SVG dans Pyqt
- 13. wpf méthode pour démarrer la boucle de message d'application
- 14. Problèmes de codage dans PyQt
- 15. comment obtenir l'élément sélectionné dans pyqt Qmenu
- 16. tableau Dessin dans une boîte de dialogue
- 17. Actualiser QTextEdit dans PyQt
- 18. PyQt: Appelez une application TrayMinimized
- 19. Comment connecter pyqtSignal entre classes dans PyQT
- 20. Boucle imbriquée dans une boucle while - Java
- 21. Comment démarrer une icône de notification
- 22. Bug lors du dessin d'une QImage sur un widget avec PIL et PyQt
- 23. Comment faire pour démarrer une boucle foreach à un index spécifique en PHP
- 24. PyQt 4 UI gèle
- 25. Comment dessiner un dessin sur une vue
- 26. comment modifier une boucle de requête while sql dans une boucle de tableau
- 27. Effacer un TableView dans PyQt
- 28. Comment construire un projet PyQT?
- 29. Comment démarrer Activity() dans une sous-classe de Dialog?
- 30. Comment démarrer IE avec une URL dans une session CYGWIN
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