いわて駐在研究日誌

OpenCAE、電子工作、R/C等、徒然なるままに

PyQtでGUIアプリ (3)

昨日までの方向とちょっと違うが、

  1. pythonでfortran90のパラメータ文を読み込み
  2. 適当に編集し
  3. ファイルに保存する

というのをやってみる。
(ようは計算設定ファイルのGUIインターフェース)

Pythonには標準でLinuxの****.confみたいな設定ファイルを読み書きするConfigParserとか、数値計算(Numpy:Numeric Python)、fortranコードをpyhtonから実行するf2py、Python-Fortran Connection Tool(SourceForge)なんてのもあるようだが、今回は、数値計算Pythonを使うとかまでは考えないことにする。

単純にパラメータを入力してファイル出力するもの:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys, os, codecs
from PyQt4 import QtGui
from PyQt4 import QtCore

class writeLines(QtGui.QWidget):

    def __init__(self, parent=None):
        super(writeLines, self).__init__(parent)

        # パラメータラベルと編集域を宣言
        self.desc1 = QtGui.QLabel("パラメータ1",self)
        self.parm1 = QtGui.QLineEdit(self)

        self.desc2 = QtGui.QLabel("パラメータ2",self)
        self.parm2 = QtGui.QLineEdit(self)

        # ボタン
        okButton = QtGui.QPushButton("OK(Save)")
        cancelButton = QtGui.QPushButton("Cancel")

        # 配置
        hbox1 = QtGui.QHBoxLayout()
        hbox1.addStretch(1)
        hbox1.addWidget(self.desc1)
        hbox1.addWidget(self.parm1)

        hbox2 = QtGui.QHBoxLayout()
        hbox2.addStretch(1)
        hbox2.addWidget(self.desc2)
        hbox2.addWidget(self.parm2)

        hboxF = QtGui.QHBoxLayout()
        hboxF.addStretch(1)
        hboxF.addWidget(okButton)
        hboxF.addWidget(cancelButton)

        vbox = QtGui.QVBoxLayout()
        vbox.addWidget(QtGui.QLabel("ほげほげパラメータ",self))
        vbox.addLayout(hbox1)
        vbox.addLayout(hbox2)
        vbox.addLayout(hboxF)

        self.setLayout(vbox)

        # Widgetウインドウの配置
        self.setWindowTitle('QLineEdit and write')

        # ボタンのシグナル
        self.connect(okButton, QtCore.SIGNAL('clicked()'),
            self.saveFile)

        self.connect(cancelButton, QtCore.SIGNAL('clicked()'),
            self.QuitDialog)

    def openFile(self):

        filename = QFileDialog.getOpenFileName(self, 'Open file', '')
        from os.path import isfile
        if isfile(filename):
            fname = codecs.open(filename,'r','utf-8') #UTF-8のファイルを読み込み
            data = fname.read()

            self.tab1.setText(data) ###

            self.setWindowTitle("Main Window: %s" % os.path.abspath(filename))

    def saveFile(self):

        savename = QtGui.QFileDialog.getSaveFileName(self, 'Save file', '')
        fname = codecs.open(savename,'w','utf-8') #UTF-8のファイルに書き込み

        fname.write("real(8), parameter :: "+self.desc1.text() +" = "+self.parm1.text()+"\n")
        fname.write("real(8), parameter :: "+self.desc2.text() +" = "+self.parm2.text()+"\n")

    def QuitDialog(self):

        reply = QtGui.QMessageBox.question(self, 'Message',
            "Are you sure to quit?", QtGui.QMessageBox.Yes |
                  QtGui.QMessageBox.No, QtGui.QMessageBox.No)
        if reply == QtGui.QMessageBox.Yes:
            quit()
        else:
            return

def main():

    app = QtGui.QApplication(sys.argv)
    exm = writeLines()
    exm.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

パラメータファイルを読み込むもの

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys, os, codecs
from PyQt4 import QtGui
from PyQt4 import QtCore

class readLines(QtGui.QWidget):

    def __init__(self, parent=None):
        super(readLines, self).__init__(parent)

        # パラメータラベルと編集域を宣言
        self.desc1 = QtGui.QLabel("パラメータ1",self)
        self.parm1 = QtGui.QLineEdit(self)

        self.desc2 = QtGui.QLabel("パラメータ2",self)
        self.parm2 = QtGui.QLineEdit(self)

        # ボタン
        openButton = QtGui.QPushButton("Open")
        saveButton = QtGui.QPushButton("Save)")
        cancelButton = QtGui.QPushButton("Cancel")

        # 配置
        hbox1 = QtGui.QHBoxLayout()
        hbox1.addStretch(1)
        hbox1.addWidget(self.desc1)
        hbox1.addWidget(self.parm1)

        hbox2 = QtGui.QHBoxLayout()
        hbox2.addStretch(1)
        hbox2.addWidget(self.desc2)
        hbox2.addWidget(self.parm2)

        hboxF = QtGui.QHBoxLayout()
        hboxF.addWidget(openButton)
        hboxF.addWidget(saveButton)
        hboxF.addWidget(cancelButton)

        vbox = QtGui.QVBoxLayout()
        vbox.addWidget(QtGui.QLabel("ほげほげパラメータ",self))
        vbox.addLayout(hbox1)
        vbox.addLayout(hbox2)
        vbox.addLayout(hboxF)

        self.setLayout(vbox)

        # Widgetウインドウの配置
        self.setWindowTitle('QLineEdit and write')

        # ボタンのシグナル
        self.connect(openButton, QtCore.SIGNAL('clicked()'),
            self.openFile)

        self.connect(saveButton, QtCore.SIGNAL('clicked()'),
            self.saveFile)

        self.connect(cancelButton, QtCore.SIGNAL('clicked()'),
            self.QuitDialog)

    def openFile(self):

        filename = QtGui.QFileDialog.getOpenFileName(self, 'Open file', '')
        from os.path import isfile
        if isfile(filename):
            fname = codecs.open(filename,'r','utf-8') #UTF-8のファイルを読み込み
            for line in fname.readlines():
                # ::,=で区切り、後ろ2つをvarname, varに格納
                (varname, var) = tuple( line.split('::')[1].split('=') )
                self.desc1.setText(varname.strip())
                self.parm1.setText(var.strip())
            fname.close()

            self.setWindowTitle("Main Window: %s" % os.path.abspath(filename))

    def saveFile(self):

        savename = QtGui.QFileDialog.getSaveFileName(self, 'Save file', '')
        fname = codecs.open(savename,'w','utf-8') #UTF-8のファイルに書き込み

        fname.write("real(8), parameter :: "+self.desc1.text() +" = "+self.parm1.text()+"\n")
        fname.write("real(8), parameter :: "+self.desc2.text() +" = "+self.parm2.text()+"\n")

    def QuitDialog(self):

        reply = QtGui.QMessageBox.question(self, 'Message',
            "Are you sure to quit?", QtGui.QMessageBox.Yes |
                  QtGui.QMessageBox.No, QtGui.QMessageBox.No)
        if reply == QtGui.QMessageBox.Yes:
            quit()
        else:
            return

def main():

    app = QtGui.QApplication(sys.argv)
    exm = readLines()
    exm.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

サンプルファイル

ほげ:: param1 = 1.0