2017-02-08 5 views
0

J'ai suivi un tutoriel dans le livre de Benjamin Root "Applications interactives utilisant Matplotlib" pour sous-classer la méthode format_coord() d'un axe d'image matplotlib. Ça marche. J'ai une application gui dans laquelle main.py importe le pointeur de données et l'utilise pour modifier les nombres interactifs affichés lorsque je déplace la souris sur l'image.pass param à sub_classed format_coord dans matplotlib

from gui_stuff.datapointer import DataPointerLeftCart 

et il est utilisé en appelant:

self.ax_lhs = self.f_lhs.add_subplot(111,projection = 'sp_data_pointer') 

le code dépouillé pour DataPointerLeftCart est défini comme suit dans un fichier séparé:

import matplotlib.projections as mproj 
import matplotlib.transforms as mtransforms 
from matplotlib.axes import Axes 
import matplotlib.pyplot as plt 


#Our own modules 
from operations.configurations import configParser 

class DataPointerLeftCart(Axes): 
    name = 'sp_data_pointer' 
    def format_coord(self, y, z): 
     configparams = configParser(ConfigFile=configfilename)   
     centreY = float(configparams['CENTRE_Y'])#units are pixels 
     scale = float(configparams['SCALE'])#nm^-1 per pixel 

    new_qy = (y-(centreY))*scale 

    return "Qy: %f (nm^-1)" % (new_qy) 

mproj.projection_registry.register(DataPointerLeftPol) 

ConfigParser() est une fonction qui lit un fichier texte et crée un dictionnaire avec divers numéros de configuration importants pour mon programme. A l'origine, cela n'avait pas d'arguments et configParser a spécifié l'emplacement du fichier texte, mais récemment j'ai modifié le programme entier afin que vous spécifiiez une copie locale du fichier de configuration. Cela nécessite que je puisse passer un argument configfilename. Cependant, je suis confus sur la façon de le faire. Le fichier configfilename doit provenir de main.py mais ici, je ne donne que le nom 'sp_data_pointer' comme argument au fichier add_subplot.

Cela me source de confusion car il n'y a nulle part (visible dans mon code) où je crée une instance de la classe et sans doute la « initialisation » méthode est pris en charge à l'intérieur des axes que je le sous-classement. Quelqu'un pourrait-il expliquer les principes et/ou une solution de contournement sale pour me faire bouger (préférable à la fois!)

Répondre

0

Je devine juste ici, mais il se pourrait bien que la méthode format_coord ne soit pas réellement utilisée d'aucune façon aux Axes initialisation Cela ouvrirait la possibilité de définir configfilename après la création. A cette fin, on pourrait faire du configfilename une variable de classe et en définir un setter.

class DataPointerLeftCart(Axes): 
    name = 'sp_data_pointer' 
    configfilename = None 

    def format_coord(self, y, z): 
     configparams = configParser(ConfigFile=self.configfilename)   
     centreY = float(configparams['CENTRE_Y'])#units are pixels 
     scale = float(configparams['SCALE'])#nm^-1 per pixel 
     new_qy = (y-(centreY))*scale 
     return "Qy: %f (nm^-1)" % (new_qy) 

    def set_config_filename(self,fname): 
     self.configfilename = fname 

Appelez ensuite le setter après la création.

self.ax_lhs = self.f_lhs.add_subplot(111,projection = 'sp_data_pointer') 
self.ax_lhs.set_config_filename("myconfigfile.config") 

Je dois admettre que je me sens un peu étrange à Axes juste pour le sous-classement de régler le format.

donc une solution de rechange pourrait être de ne pas sous-classe Axes mais d'utiliser le format_coord à l'intérieur du main.py:

from operations.configurations import configParser 
configfilename = "myconfigfile.config" 

def format_coord(y, z): 
    configparams = configParser(ConfigFile=configfilename)   
    centreY = float(configparams['CENTRE_Y'])#units are pixels 
    scale = float(configparams['SCALE'])#nm^-1 per pixel 
    new_qy = (y-(centreY))*scale 
    return "Qy: %f (nm^-1)" % (new_qy) 

ax_lhs = f_lhs.add_subplot(111) 
ax_lhs.format_coord = format_coord 
+0

Merci j'ai utilisé la première méthode et cela a fonctionné comme un charme! – MikeS