昨日までの方向とちょっと違うが、
- pythonでfortran90のパラメータ文を読み込み
- 適当に編集し
- ファイルに保存する
というのをやってみる。
(ようは計算設定ファイルの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