2017-03-19 6 views
1

Qt Designerで生成されたのAxisItemをpyqtgraphの既存のPlotWidgetに追加しようとしています。関連トピックhereがありますが、コード例での正確な答えはありません。コメントできませんので、新しいトピックを作成しました。既存のPlotWidgetにカスタムAxisItemを追加するには?

これは私のカスタム(thisコードに基づく)AxisItemです:

import pyqtgraph as pg 
import datetime 

def int2td(ts): 
    return(datetime.timedelta(seconds=float(ts)/1e6)) 

class TimeAxisItem(pg.AxisItem): 
    def __init__(self, *args, **kwargs): 
     super(TimeAxisItem, self).__init__(*args, **kwargs) 
    def tickStrings(self, values, scale, spacing): 
     return [int2dt(value).strftime("%H:%M:%S") for value in values] 

は、これが私のメインQtPlotterクラスです:

from pyqtgraph.Qt import QtGui 
from template_pyqt import Ui_Form # Ui_Form is generated by Qt Designer 

class QtPlotter: 
    def __init__(self): 
     self.app = QtGui.QApplication([]) 
     self.win = QtGui.QWidget() 
     self.ui = Ui_Form() 
     self.ui.setupUi(self.win) 
     self.win.show() 

     self.ui_plot = self.ui.plot 
     self.ui_plot.showGrid(x=True, y=True) 

そして、私は私を追加しようとしていますカスタムAxisItem

self.ui_plot.getPlotItem().axes['bottom']['item'] = TimeAxisItem(orientation='bottom') 

エラーはありませんが、これは何の効果もありません。

答えて

2

クラスはsetAxisメソッドを持たず、現在の軸を取得するメソッドはgetAxisのみです。 PlotItemコンストラクタのaxisItemsパラメータに軸項目を含む辞書を指定できますが、PlotItemAxisItemを更新することはできないようです。

PlotItem.axes辞書は公開属性ですが、文書化されていないため、それを使用するだけで少し危険です。 PyQtGraphの作成者は、その動作を変更したり、名前を変更したりする可能性があります(ただし、この変更はわずかです)。 IMHOそれは私的な属性にされているはずです。

## Create and place axis items 
    if axisItems is None: 
     axisItems = {} 
    self.axes = {} 
    for k, pos in (('top', (1,1)), ('bottom', (3,1)), ('left', (2,0)), ('right', (2,2))): 
     if k in axisItems: 
      axis = axisItems[k] 
     else: 
      axis = AxisItem(orientation=k, parent=self) 
     axis.linkToView(self.vb) 
     self.axes[k] = {'item': axis, 'pos': pos} 
     self.layout.addItem(axis, *pos) 
     axis.setZValue(-1000) 
     axis.setFlag(axis.ItemNegativeZStacksBehindParent) 

おそらく、あなたはそれを見てで動作させることができます。PlotItemコンストラクタのsourceを見て、あなたがaxisItemパラメータから軸項目がプロット項目に追加されているかを確認することができますどのような場合には

、上記のコード。繰り返しますが、これは文書化されていない動作であり、自己責任で使用してください!さらに、メモリリークを防ぐために新しいものを設定する場合は、古いAxisItemを適切に削除してリンクを解除する必要があります。おそらく、これは手間がかかり、PlotItem.setAxisメソッドが存在しない理由が考えられます。

関連する問題