Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Mise à jour d'une image sous wxPython

4 réponses
Avatar
Charles
Bonjour,

Je suis en train de cr=E9er une application qui affiche les images
provenant d'une camera. Ces images sont r=E9cup=E9r=E9es de fa=E7on p=E9rio=
dique
par tcp sous forme de buffer.

Pour la afficher, je mets =E0 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=E9s), j'ai donc mis le code qui g=E8re la r=E9cup=E9ration de=
s
images, ainsi que le 'SetBitmap' pr=E9c=E9dent dans un thread... mais la
mise =E0 jour est tr=E8s saccad=E9e !

Quelqu'un aurait une fa=E7on plus propre de d=E9velopper ce programme ?

Merci.

Charles

4 réponses

Avatar
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é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
Avatar
Charles
On 9 déc, 08:37, NicolasP wrote:
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
Avatar
NicolasP
>
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
Avatar
NicolasP
Et l'exemple, ça aide ?

Nicolas