2017-02-08 7 views
0

Я следовал учебнику в книге Бенджамина Рута «Интерактивные приложения с использованием Matplotlib» для подкласса метода format_coord() осей изображения matplotlib. Оно работает. У меня есть приложение gui, в котором main.py импортирует указатель данных и использует его для изменения интерактивных номеров, отображаемых при перемещении мыши над изображением.pass param для sub_classed format_coord в matplotlib

from gui_stuff.datapointer import DataPointerLeftCart 

, а затем он используется по телефону:

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

раздели вниз код DataPointerLeftCart определяется следующим образом в отдельном файле:

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() является функцией который читает текстовый файл и создает словарь с различными важными номерами конфигурации для моей программы. Первоначально у этого не было аргументов, и configParser указывал местоположение текстового файла, но недавно я изменил всю программу, чтобы указать локальную копию файла конфигурации. Это требует от меня возможности передать аргумент configfilename. Однако я смущен тем, как это сделать. Имя configfilename должно поступать из main.py, но здесь я указываю только имя sp_data_pointer в качестве аргумента add_subplot.

Это сбивает с толку меня, так как нет нигде (видимо в моем коде), где я создаю экземпляр класса и предположительно метод «INIT» позаботятся внутри осей, которые я подклассов. Может ли кто-нибудь объяснить принципы и/или грязное обходное решение, чтобы заставить меня двигаться (предпочтительнее обоих!)

ответ

0

Я просто угадываю здесь, но вполне возможно, что метод format_coord фактически не используется каким-либо образом в топорах инициализация. Это откроет возможность установить configfilename после создания. С этой целью можно было бы сделать configfilename переменной класса и определить для него установщик.

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 

Затем вызовите сеттер после создания.

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

Я должен признать, что я чувствую себя немного странно о подклассов Axes только для установки формата.

Так альтернатива может быть не подкласс Axes но использовать format_coord внутри 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

Спасибо Я использовал первый метод, и он работал как шарм! – MikeS