IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

wxPython Discussion :

Placer un graphique pylab dans une fenetre wxPython


Sujet :

wxPython

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 25
    Par défaut Placer un graphique pylab dans une fenetre wxPython
    Bonjour à tous.

    Je cherche à placer en des coordonnées précises un graphique (polaires) issu de pylab sur ma fenêtre wxPython. Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    # -*- coding:utf8 -*-
     
    import matplotlib
    import wx
    from pylab import *
    from visual import *
    from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigCanvas
     
    class gui(wx.Frame):
    	def __init__(self,titre):
    		wx.Frame.__init__(self,parent=None,id=1,title=titre,pos=wx.DefaultPosition, size=(1200,800), style=wx.DEFAULT_FRAME_STYLE, name='frame')
    		conteneur = wx.Panel(self,1)
     
     
    		self.data=[0,1,2,3]
    		self.dpi=100
    		self.fig = Figure((6.0, 6.0),dpi=self.dpi)
    		self.canvas = FigCanvas(self,-1,self.fig)
    		self.axes=self.fig.add_subplot(111)
    		self.axes.set_axis_bgcolor('w')	
    		self.axes.set_title('Figure')
    		self.axes.grid(True)
    		self.plot_data = self.axes.plot(self.data)[0]
    		self.canvas.draw()	
     
     
    class appli(wx.App):
    	def OnInit(self):
    		fen = gui("prog")
    		self.SetTopWindow(fen)
    		fen.Show(True)
    		return True
     
    app = appli()
    app.MainLoop()
    Le problème est que la figure se place dans le coin supérieur gauche de ma fenêtre. Je ne sais pas avec quelle fonction je peux la placer à l'endroit désiré et j'enrage de ne pas avoir trouvé sur le net. Je n'utilise qu'un seul conteneur. Je souhaite de toute façon que la géométrie de ma fenêtre soit fixe (pas de redimensionnement possible).

    Merci pour toute aide apportée.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Par défaut
    Bonjour,

    Le mieux est d'utiliser les sizers, c'est fait pour ça. Surtout que je pense que tu veux rajouter des widgets dans ta fenêtre.
    Si t'es pas habitué tu dois pouvoir trouver des tutos assez facilement.

    Voici un exemple. J'ai centré le graph horizontalement avec une marge de 10px et j'ai rajouté 2 boutons (pour l'exemple) centrés eux aussi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    # -*- coding:utf8 -*-
     
    import matplotlib
    import wx
    from pylab import *
     
    from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigCanvas
     
    class gui(wx.Frame):
    	def __init__(self,titre):
    		wx.Frame.__init__(self, parent=None, id=-1, title=titre, pos=wx.DefaultPosition, size=(1200,800), style=wx.DEFAULT_FRAME_STYLE, name='frame')
     
    		self.data=[0,1,2,3]
    		self.dpi=100
    		self.fig = Figure((6.0, 6.0),dpi=self.dpi)
    		self.canvas = FigCanvas(self,-1,self.fig)
    		self.axes=self.fig.add_subplot(111)
    		self.axes.set_axis_bgcolor('w')	
    		self.axes.set_title('Figure')
    		self.axes.grid(True)
    		self.plot_data = self.axes.plot(self.data)[0]
    		self.canvas.draw()	
     
    		sizerPrincipale = wx.BoxSizer(wx.VERTICAL)
    		sizerPrincipale.Add(self.canvas, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 10)
     
     
    		sizerBoutons = wx.BoxSizer()
    		btn1 = wx.Button(self, -1, "Bouton 1")
    		btn2 = wx.Button(self, -1, "Bouton 2")
    		sizerBoutons.Add(btn1)
    		sizerBoutons.Add(btn2)
    		sizerPrincipale.Add(sizerBoutons, 0, wx.ALIGN_CENTER_HORIZONTAL)
     
    		self.SetSizer(sizerPrincipale)
     
    		self.Show()
     
     
     
    app = wx.App(0)
    frame = gui("prog")
    app.MainLoop()

  3. #3
    Membre averti
    Inscrit en
    Décembre 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 25
    Par défaut
    Merci mais je préférerais me passer des sizers. De toute façon, ma fenêtre doit garder une taille fixe, je place donc mes éléments avec leurs coordonnées "absolues". Il doit bien exister une fonction pour placer précisément cette maudite image non ? (comme pour les boutons ou les statictext).

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Par défaut
    ça fonctionne en rajoutant un panel. C'est vrai que le comportement est bizarre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    # -*- coding:utf8 -*-
     
    import matplotlib
    import wx
    from pylab import *
     
    from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigCanvas
     
    class gui(wx.Frame):
    	def __init__(self,titre):
    		wx.Frame.__init__(self,parent=None,id=-1,title=titre,pos=wx.DefaultPosition, size=(1200,800), style=wx.DEFAULT_FRAME_STYLE, name='frame')
    		conteneurPrinc = wx.Panel(self,-1)
    		conteneurGraph = wx.Panel(conteneurPrinc,-1, pos=(100,100))
     
    		self.data=[0,1,2,3]
    		self.dpi=100
    		self.fig = Figure((6.0, 6.0),dpi=self.dpi)
    		self.canvas = FigCanvas(conteneurGraph,-1,self.fig)
    		self.axes=self.fig.add_subplot(111)
    		self.axes.set_axis_bgcolor('w')	
    		self.axes.set_title('Figure')
    		self.axes.grid(True)
    		self.plot_data = self.axes.plot(self.data)[0]
    		self.canvas.draw()
    		conteneurGraph.Fit()
     
    class appli(wx.App):
    	def OnInit(self):
    		fen = gui("prog")
    		self.SetTopWindow(fen)
    		fen.Show(True)
    		return True
     
    app = appli()
    app.MainLoop()

  5. #5
    Membre averti
    Inscrit en
    Décembre 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 25
    Par défaut
    Merci ! Ça marche très bien sur mon programme.

    Une question subsidiaire : Comment afficher dans la barre de statut les coordonnées du pointeur de la souris placé sur la fenêtre (de manière à régler proprement et facilement les coordonnées de chaque élément) ?

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Par défaut
    Il faut déjà ajouter une statutbar à la frame, et connecter l'évènement "motion_notify_event" du canvas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    # -*- coding:utf8 -*-
     
    import matplotlib
    import wx
    from pylab import *
     
    from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigCanvas
     
    class gui(wx.Frame):
    	def __init__(self,titre):
    		wx.Frame.__init__(self,parent=None,id=-1,title=titre,pos=wx.DefaultPosition, size=(1200,800), style=wx.DEFAULT_FRAME_STYLE, name='frame')
    		conteneurPrinc = wx.Panel(self,-1)
    		conteneurGraph = wx.Panel(conteneurPrinc,-1, pos=(100,100))
    		self.statutBar = wx.StatusBar(self)
    		self.SetStatusBar(self.statutBar)
    		self.data=[0,1,2,3]
    		self.dpi=100
    		self.fig = Figure((6.0, 6.0),dpi=self.dpi)
    		self.canvas = FigCanvas(conteneurGraph,-1,self.fig)
    		self.axes=self.fig.add_subplot(111)
    		self.axes.set_axis_bgcolor('w')	
    		self.axes.set_title('Figure')
    		self.axes.grid(True)
    		self.plot_data = self.axes.plot(self.data)[0]
    		self.canvas.draw()
    		self.canvas.mpl_connect('motion_notify_event', self.onMotion)
    		conteneurGraph.Fit()
     
    	def onMotion(self, event):
    		x = event.xdata
    		y = event.ydata
    		if x and y:
    			statut = "x=%f, y=%f"%(x, y)
    		else:
    			statut = ""
    		self.statutBar.SetStatusText(statut)
     
    class appli(wx.App):
    	def OnInit(self):
    		fen = gui("prog")
    		self.SetTopWindow(fen)
    		fen.Show(True)
    		return True
     
    app = appli()
    app.MainLoop()

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. créer une zone graphique dans une fenetre
    Par jlg75 dans le forum Windows
    Réponses: 12
    Dernier message: 13/01/2012, 00h04
  2. Mettre un JPG dans une fenetre graphique?
    Par scraven dans le forum MATLAB
    Réponses: 1
    Dernier message: 27/04/2008, 01h31
  3. [BPW]Raccourcis clavier dans une fenêtre enfant
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 18/02/2004, 20h07
  4. saisie dans une fenetre de service
    Par gord's dans le forum Composants VCL
    Réponses: 4
    Dernier message: 05/11/2003, 16h25
  5. gérer les jpg dans une fenetre directdraw???
    Par Anonymous dans le forum DirectX
    Réponses: 1
    Dernier message: 14/06/2002, 13h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo