2017-01-16 6 views
2

私はPython 3.5でアプリケーションを書いています& PyQT 5.このアプリケーションでは、埋め込みmatplotlibキャンバスと埋め込みmatplotlib NavigationToolbarがあります。アプリケーションはいくつかのデータを測定し、それらをプロットします。ユーザーはある時点で、プロットをエクスポートして、どこかの ".png"ファイルに保存して、何か新しいものを測定したいと思っています。PyQt5アプリケーションのMatplotlib NavigationToolbarからデフォルトのファイル名を変更する方法は?

このため、NavigationToolbarで「フロッピー」/「保存」アイコンを使用していて、うまくいきます。しかし、それをクリックすると、プログラム(または最後に開いたフォルダ)のルートフォルダにダイアログが開き、保存されたイメージの名前が "image.png"としてあらかじめ入力されます。

この既定のデフォルト名を "measurement_7453243.png"や "2017_01_16_measurement.png"のような私のプログラムのカスタムに変更したいと思います。私にこれをさせる方法はありますか?

アイデア#1:私が見つけたのは、matplotlib.rcParams ['savefig.directory']を使用してダイアログを開く場所のディレクトリを設定するオプションです。ファイル名ではありません。私は、デフォルトのファイル名を変更する 'savefig.XXXX'プロパティを見つけることができないようです。

アイデア#2:NavigationToolbar以外のアプリケーションでカスタムボタンを作成すると、カスタムファイルをQtで保存するダイアログが表示され、次にsavefig()を使用して図を保存できます。しかし、なぜ、私が欲しいものを今までにない素晴らしいボタンがあれば、それはなぜですか?

適切な情報源で「これはできません」と同様に、ヒントやアイデアは非常に高く評価されます。

+1

私はかつて同じ問題を抱えていましたが、すぐに解決策を見つけることができませんでした。アイデア#2とまったく同じように実装しました。それにもかかわらず、私は解決策があると確信しています。 – ImportanceOfBeingErnest

答えて

3

デフォルトのファイル名は、FigureCanvasBase.get_default_filenameという方法で提供されています。

canvas = FigureCanvas(fig) 
canvas.get_default_filename = lambda: 'new_default_name.png' 

を、私は適切な方法は、メソッドをオーバーライドして、多分、デフォルトのファイル名を設定するためのAPIを提供し、しかしFigureCanvasをサブクラス化された推測:キャンバスが作成された後は、ちょうど猿はそれにパッチを適用することができます。

from PyQt5.QtWidgets import (
    QMainWindow, QApplication, QWidget, QVBoxLayout) 

from matplotlib.figure import Figure 
from matplotlib.backends.backend_qt5agg import (
    FigureCanvasQTAgg as FigureCanvas, 
    NavigationToolbar2QT as NavigationToolbar) 


class AppForm(QMainWindow): 
    def __init__(self, parent=None): 
     QMainWindow.__init__(self, parent) 
     main_frame = QWidget() 

     fig = Figure((5.0, 4.0), dpi=100) 
     ax = fig.add_subplot(111) 
     ax.plot([1, 2, 4, 8]) 

     canvas = FigureCanvas(fig) 
     canvas.get_default_filename = lambda: 'new_default_name.png' 
     mpl_toolbar = NavigationToolbar(canvas, main_frame) 

     vbox = QVBoxLayout() 
     vbox.addWidget(canvas) # the matplotlib canvas 
     vbox.addWidget(mpl_toolbar) 
     main_frame.setLayout(vbox) 
     self.setCentralWidget(main_frame) 


app = QApplication(['Test']) 
form = AppForm() 
form.show() 
app.exec_() 
+0

答えをありがとう、私はこれを試してみて、それが私のプログラムとどのように動作するか見てみましょう:)。 – erthy

+0

私はこれを私のアプリで試してみると、うまく動作しません。呼び出しは成功します(つまり、例外はスローされません)が、Figureを保存するときには何も変更されません。 実例を提供する可能性はありますか? – erthy

+0

@erthy私は混乱しています。昨日のパラレルユニバースで、 'fig.set_label'はあなたがスタンドアロンのインタラクティブな図形のために望んだことをしました。今は 'fig.canvas.set_window_title'ですが、残念ながら埋め込み図では何もしませんので別の方法を見つけなければなりません。私はもう一度別の宇宙に運ばれた場合のために[mcve]を用意しました。 – Goyo

1

あなたは常にこの操作を行うことができるかどうかわからないが、私の場合にはフィギュアインスタンスは、私ができるキャンバスの属性を持っていた:ここ

はmatplotlibのドキュメントから適応猿のパッチを、使用してQt5Aggの例ですMonkeypatchとしてGoyoを提案します。

関連する問題