filetage: Il n'est pas sécuritaire d'utiliser des images en dehors du thread GUI
Je suis en train de construire un lecteur de musique, qui vérifie l'état avec SqueezePlay, qui est une SqueezeBox controller app. Pour couper une longue histoire courte, je suis à la vérification de l'état de Squeezeplay jamais 5 secondes à l'aide de filetage. Si le titre de la chanson changements, j'ai laisser mettre à jour les étiquettes (Qlabel, la pochette de l'album (QPixmap), etc. Cependant, lorsqu'on lui demande de le mettre à jour via le filetage, je suis Il n'est pas sécuritaire d'utiliser des images en dehors du thread GUI .
Comment puis-je faire threading, mais toujours le QPixmap?
Exemple de code:
#self.sq.getArtwork() returns variable with the image
coverArt = self.sq.getArtwork()
coverPixMap = QtGui.QPixmap()
coverPixMap.loadFromData(coverArt)
self.albumArt.setPixmap(coverPixMap)
Merci beaucoup!
Mise à jour:
J'ai essayé les à Émettre, mais il ne fonctionne pas, quelqu'un peut-il prendre un coup d'oeil ce que je fais mal?
def setNewArtwork(self, image):
coverPixMap = QtGui.QPixmap()
coverPixMap.convertFromImage(image)
icon = QtGui.QIcon(coverPixMap)
item.setIcon(icon)
def getNewArtwork(self):
coverArt = self.sq.getArtwork()
icon = QtGui.QImage(coverArt)
self.emit(QtCore.SIGNAL('setNewArtwork(QImage)'), icon)
self.emit(QtCore.SIGNAL('setNewArtwork(QImage)'), icon)
Cette ligne doit avoir QPixmap au lieu de QImage, puisque vous êtes en utilisant des images? Je ne sais pas comment dur les types d'application. Assurez-vous également que vous êtes en utilisant une file d'attente de connexion, si un tel concept existe en PyQT. Cela garantit que la fente est exécuté dans le récepteur thread plutôt que de l'appelant fil.Quand vous dites "ne pas travailler" avec les signaux, en quoi n'est-ce pas le travail? Ce qui ne va pas? La même chose? Quelque chose d'autre?
avez-vous trouvé une solution? Je suis intéressé.
OriginalL'auteur FLX | 2011-12-27
Vous devez vous connecter pour publier un commentaire.
Tous les graphiques Qt opérations devrait se faire dans le thread principal. Les autres threads ne sont pas vraiment autorisés à appeler Qt graphique des opérations (y compris probablement pixmaps).
Ils pourraient émettent des signaux Qt pour le thread principal. Ou tout simplement (sur Linux) d'écrire dans un tuyau, et qui ont fil d'attente pour l'entrée sur le tuyau.
Bien sûr, vous devez définir les signaux (et aussi les fentes que vous voulez. Dans le code C++, vous avez besoin de les marquer avec
signals:
(ouslots:
) et votre code C++ devraient être traitées par le moc. Je ne sais pas quel est le Python homologue (peut-être python capacité de réflexion pourrait être suffisant, je ne sais vraiment pas). Ensuite, vous devez connecter des signaux de machines à sous, avec un en file d'attente connexion. Je n'ai aucune idée de comment le faire en Python.J'ai ajouté quelques liens. Documentation de Qt est beaucoup mieux que ce que j'ai pu l'expliquer dans quelques minutes!
Merci Basile, je l'ai essayé mais ça ne fonctionne pas; voir mon exemple dans le post original - ce que je fais bêtement mal?
Vous avez probablement de définir vos signaux et les slots, et de connecter des signaux aux machines à sous. Vous devriez trouver comment le faire en Python (ou le code de votre application en C++, ou avec GTK...)
OriginalL'auteur Basile Starynkevitch
Pour répondre à la question concernant la façon d'émettre le signal en python:
Contrairement au C++, en émettant un définis par l'utilisateur PyQt signal (par opposition à un Qt), la signature doit être omis.
Donc, pour émettre le signal, faire quelque chose comme ceci:
Et connecter le signal, faire quelque chose comme ceci:
Et juste pour être clair:
Pour ce travail, le non-thread gui doit émettre le signal, qui est ensuite reçu par le widget dans le main thread gui. La création d'un
QImage
dans le non-thread gui devrait être d'accord, mais n'essayez jamais d'appeler l'interface graphique méthodes liées à l'extérieur du thread principal.NB:
J'ai utilisé l'ancien style signal de syntaxe ici parce que c'est ce que vous semblez être en utilisant. Cependant, vous voudrez peut-être regarder à PyQt est nouveau style de signaux et de slots de soutien car il est beaucoup plus souple et pythonic.
OriginalL'auteur ekhumoro
vous avez probablement besoin d'envoyer tous vos dessin d'emplois pour le thread principal.
OriginalL'auteur Michał Šrajer
J'ai essayé qqch, s'il vous plaît laissez-moi savoir si ça sonne une cloche, j'ai fait qqch de similaire pour le mien (mais je suis loin de python pour un certain temps, donc j'ai peut-être fait des erreurs, si oui, désolé.)
QPixmap: It is not safe to use pixmaps outside the GUI thread
OriginalL'auteur NotCamelCase