Mise à jour d'une image sous wxPython

Le
Charles
Bonjour,

Je suis en train de créer une application qui affiche les images
provenant d'une camera. Ces images sont récupérées de façon pério=
dique
par tcp sous forme de buffer.

Pour la afficher, je mets à jour l'image de mon interface avec
wx.StaticBitmap.SetBitmap(wx.BitmapFromBuffer(640, 480,
image_buffer)).
wx.Frame.Update()

Pour ne pas bloquer l'interface (qui contient d'autres
fonctionnalités), j'ai donc mis le code qui gère la récupération de=
s
images, ainsi que le 'SetBitmap' précédent dans un thread mais la
mise à jour est très saccadée !

Quelqu'un aurait une façon plus propre de développer ce programme ?

Merci.

Charles
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
NicolasP
Le #18088261
Charles a écrit :
Bonjour,

Je suis en train de créer une application qui affiche les images
provenant d'une camera. Ces images sont récupérées de façon périodique
par tcp sous forme de buffer.

Pour la afficher, je mets à jour l'image de mon interface avec
wx.StaticBitmap.SetBitmap(wx.BitmapFromBuffer(640, 480,
image_buffer)).
wx.Frame.Update()

Pour ne pas bloquer l'interface (qui contient d'autres
fonctionnalités), j'ai donc mis le code qui gère la récupération des
images, ainsi que le 'SetBitmap' précédent dans un thread... mais la
mise à jour est très saccadée !

Quelqu'un aurait une façon plus propre de développer ce programme ?



En programmation multithreads, la mise à jour des éléments de l'interface graphique ne doit être faite QUE par le thread gérant l'interface. En général, il s'agit du thread principal. Si cette règle n'est pas respectée, on ne peut pas prédire le comportement de l'interface. Donc, le thread 'travailleur' doit stocker les données dans un buffer et prévenir le thread 'interface' qu'il doit faire une mise à jour de l'affichage.
Je dois avoir un exemple de code quelque part. Si tu es intéressé, je peux chercher et en publier des extraits ici.

Nicolas
Charles
Le #18089711
On 9 déc, 08:37, NicolasP
Charles a écrit :

> Bonjour,

> Je suis en train de créer une application qui affiche les images
> provenant d'une camera. Ces images sont récupérées de façon p ériodique
> par tcp sous forme de buffer.

> Pour la afficher, je mets à jour l'image de mon interface avec
> wx.StaticBitmap.SetBitmap(wx.BitmapFromBuffer(640, 480,
> image_buffer)).
> wx.Frame.Update()

> Pour ne pas bloquer l'interface (qui contient d'autres
> fonctionnalités), j'ai donc mis le code qui gère la récupératio n des
> images, ainsi que le 'SetBitmap' précédent dans un thread... mais l a
> mise à jour est très saccadée !

> Quelqu'un aurait une façon plus propre de développer ce programme ?

En programmation multithreads, la mise à jour des éléments de l'int erface graphique ne doit être faite QUE par le thread gérant l'interfac e. En général, il s'agit du thread principal. Si cette règle n'est pa s respectée, on ne peut pas prédire le comportement de l'interface. Don c, le thread 'travailleur' doit stocker les données dans un buffer et pr évenir le thread 'interface' qu'il doit faire une mise à jour de l'affi chage.
Je dois avoir un exemple de code quelque part. Si tu es intéressé, je peux chercher et en publier des extraits ici.

Nicolas



Ah ouais, je veux bien un exemple, ça m'aiderait à réaliser ma p#?%!!
*§ d'interface !

Merci.

Charles
NicolasP
Le #18091551
>
Ah ouais, je veux bien un exemple, ça m'aiderait à réaliser ma p#?%!!
*§ d'interface !



J'ai retrouvé le code.
Et en plus c'est simple...

------------------
Module Events.py :
import wx

EVT_RESULT_ID = 100

class ResultEvent(wx.PyEvent):
"""Simple event to carry arbitrary result data."""
def __init__(self, data):
"""Init Result Event."""
wx.PyEvent.__init__(self)
self.SetEventType(EVT_RESULT_ID)
self.data = data

-----------------------------
Module Thread 'travailleur' :
import wx
from Events import *
.
.
.
wx.PostEvent(self.my_wnd, ResultEvent({"Action" : "AddText",
"Line" : self.line,
"Column" : self.column,
"Content" : self.data}))

.
.
.

---------------------------
Module thread 'interface' :
import wx
from Events import *

class MyWnd(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, style = wx.CAPTION)
.
.
.
self.Connect(-1, -1, EVT_RESULT_ID, self.OnMessage)
.
.
.


def OnMessage (self, event):
data = event.data
if data["Action"] == "AddText" :
txt = data["Content"]
line = data["Line"]
column = data["Column"]
.
.
.

Nicolas
NicolasP
Le #18142351
Et l'exemple, ça aide ?

Nicolas
Publicité
Poster une réponse
Anonyme