Bonjour,
j'ai un petit problème d'affichage d'image avec PyQt. Je souhaiterais afficher une image dans un TabWidget et la modifier périodiquement. Cette partie s'inscrit dans un programme plus ample qui donne satisfaction pour le reste.
Voici le code du premier fichier camera.py généré par Qt Designer
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'camera.ui'
#
# Created: Wed Dec 30 10:51:35 2009
# by: PyQt4 UI code generator 4.4.4
#
# WARNING! All changes made in this file will be lost!
from PyQt4 import QtCore, QtGui
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.tabWidget = QtGui.QTabWidget(self.centralwidget)
self.tabWidget.setGeometry(QtCore.QRect(20, 20, 661, 471))
self.tabWidget.setObjectName("tabWidget")
self.tab = QtGui.QWidget()
self.tab.setObjectName("tab")
self.frame = QtGui.QFrame(self.tab)
self.frame.setGeometry(QtCore.QRect(40, 40, 581, 351))
self.frame.setFrameShape(QtGui.QFrame.StyledPanel)
self.frame.setFrameShadow(QtGui.QFrame.Raised)
self.frame.setObjectName("frame")
self.tabWidget.addTab(self.tab, "")
self.tab_2 = QtGui.QWidget()
self.tab_2.setObjectName("tab_2")
self.label = QtGui.QLabel(self.tab_2)
self.label.setGeometry(QtCore.QRect(30, 40, 531, 341))
self.label.setPixmap(QtGui.QPixmap("Frank.gif"))
self.label.setObjectName("label")
self.tabWidget.addTab(self.tab_2, "")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QtGui.QApplication.translate("MainWindow", "Tab 1", None, QtGui.QApplication.UnicodeUTF8))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), QtGui.QApplication.translate("MainWindow", "Tab 2", None, QtGui.QApplication.UnicodeUTF8))
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
et enfin le code qui pose problème:
# -*- coding: cp1252 -*-
# How to use PIL images in PyQt4
import os, sys
import Image
import threading
import time
from PyQt4 import QtCore, QtGui
from camera import Ui_MainWindow
from VideoCapture import Device
class MiniViewer(QtGui.QMainWindow, Ui_MainWindow ):
"this class demonstrates how to use PIL images in PyQt [does not work yet!]"
def __init__(self, parent = None):
#démarrage des init individuels des fenêtres
QtGui.QMainWindow.__init__(self)
Ui_MainWindow.__init__(self)
self.setupUi(self)
# intefacage de la caméra
self.camok=True
try:
self.cam = Device(devnum=0)
except :
print 'pas de caméra'
self.camok=False
self.image_cam= QtGui.QImage()
thread_cam=threading.Thread(target=self.aff)
thread_cam.start()
def open(self,infile):
# load an image using PIL, first read it
#self.cam.saveSnapshot(infile, timestamp=3, boldfont=1)
self.PILimage = Image.open(infile)
self.PILimage=self.PILimage.resize((440,500))
# now update the QImage according to the PIL image
self.__PIL2Qt()
def aff(self):
# lecture de la caméra directe using PIL, first read it
encoder="jpeg"
mode="RGB"
while 1:
if self.camok: #si vraiment la caméra est en fonction
print 'on y va pour la cam'
self.PILimage=self.cam.getImage(timestamp=1)
PILstring = self.PILimage.convert(mode).tostring(encoder, mode)
self.image_cam.loadFromData(QtCore.QByteArray(PILstring))
self.image_cam.save("image_bis.jpg","JPG")
# la ligne suivante ne fonctionne pas
self.label.setPixmap(QtGui.QPixmap("image_bis.jpg"))
time.sleep(2) # inutile si on veut de la vidéo
## def paintEvent(self, Event):
## painter = QtGui.QPainter(self)
## painter.drawImage(0,0,self.image_cam)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
viewer = MiniViewer()
viewer.show()
sys.exit(app.exec_())
C'est la ligne contenant le setPixmap qui ne fonctionne pas. J'ai cherché pendant plusieurs heures la solution sur les différents blogs... mais apparemment je ne suis pas doué car je n'ai pas trouvé le truc.
Merci de votre réponse.