PyQt を使って GUIテキストファイル分割ツールをPythonで作成する

PyQtを使うと、Pythonで作成したコマンドラインのユーティリティプログラムに、ひと手間加えるだけで、GUIのインターフェースを作成できて非常に便利。

text_spliter

こんな程度なら、ちょいちょいっと、リファレンスを調べながら、ノリで作成できる手軽さもよい。

http://pyqt.sourceforge.net/Docs/PyQt4/classes.html

pyqt_cls_reference

リファレンスページも、見やすい(検索しやすい)ので、だいたい、それっぽいキーワードで検索するとそれっぽいクラスが引っ掛かる。

self.txtLimit.setAlignment(core.Qt.AlignRight)

上記(テキストのアライメントを右寄せ指定)のように、メソッドのパラメータに渡す列挙型などは、QtCoreモジュールのQt クラスに定義されている。

モジュール一覧

http://pyqt.sourceforge.net/Docs/PyQt4/modules.html

Qtクラス

http://pyqt.sourceforge.net/Docs/PyQt4/qt.html

コード

# -*- encoding:utf-8 -*-
import sys
import re
import os
from datetime import datetime
from PyQt4 import QtGui as gui
from PyQt4 import QtCore as core
import re
import codecs
 
class MainWindow(gui.QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.initUi()
 
    def initUi(self):
        grid = gui.QGridLayout()
 
        form = gui.QFormLayout()
        self.txtSepFile = gui.QLineEdit()
        btnSepFile = gui.QPushButton(u'...')
        btnSepFile.setMaximumWidth(40)
        btnSepFile.clicked.connect(self.chooseDbFile)
        boxSepFile = gui.QHBoxLayout()
        boxSepFile.addWidget(self.txtSepFile)
        boxSepFile.addWidget(btnSepFile)
        form.addRow(u'対象ファイル', boxSepFile)
 
        self.txtLimit = gui.QLineEdit()
        self.txtLimit.setText(u'10000')
        self.txtLimit.setAlignment(core.Qt.AlignRight)
        self.txtLimit.setFixedWidth(100)
        form.addRow(u'行数', self.txtLimit)
 
        encodes = ('shift_jis','cp932','utf-8')
 
        self.cmbSrcEncode = gui.QComboBox(self)
        self.cmbSrcEncode.addItems(encodes)
        self.cmbSrcEncode.setFixedWidth(150)
        boxSrcEncode = gui.QHBoxLayout()
        boxSrcEncode.addWidget(self.cmbSrcEncode)
        form.addRow(u'対象エンコード', boxSrcEncode)
 
        boxCtrl = gui.QHBoxLayout()
        btnExec = gui.QPushButton(u'実行')
        btnExec.clicked.connect(self.doExec)
        boxCtrl.addWidget(btnExec)
 
        msgCtrl = gui.QVBoxLayout()
        msgCtrl.addWidget(gui.QLabel(u"テキストファイルを指定行数で分割します。"))
 
        grid.addLayout(msgCtrl,0,0)
        grid.addLayout(form,1,0)
        grid.addLayout(boxCtrl,2,0)
        self.setLayout(grid)
        self.resize(400,100)
 
        self.setWindowTitle(u"テキストファイル分割")
        self.show()
 
    def doExec(self):
        in_file = unicode(self.txtSepFile.text())
 
        in_codec = unicode(self.cmbSrcEncode.currentText())
 
        s_limit = unicode(self.txtLimit.text())
        if not unicode.isnumeric(s_limit):
            gui.QMessageBox.warning(self,"Completed",u"行数の指定が不正です。")
            return
 
        self.separateFile(in_file, in_codec, int(s_limit))
 
        gui.QMessageBox.information(self,"Completed",u"作成完了しました。",gui.QMessageBox.Ok)
 
    def chooseDbFile(self):
        dialog = gui.QFileDialog()
        dialog.setFileMode(gui.QFileDialog.ExistingFile)
        if dialog.exec_():
            fileNames = dialog.selectedFiles()
            for f in fileNames:
                self.txtSepFile.setText(f)
                return
        return self.txtSepFile.setText('')
 
 
    def separateFile(self, in_file, in_codec, limit):
 
        extention = ""
        out_file = in_file
        try:
            in_sep_period = in_file.split(".")
            extention = in_sep_period[1]
            out_file = ".".join(in_sep_period[:-1])
        except IndexError:
            pass
 
        in_fd = None
        out_fd = None
        try:
            sufix = 0
            line = 0
            in_fd = codecs.open(in_file, 'r', in_codec)
            for l in in_fd:
                if line == 0:
                    if out_fd:
                        out_fd.close()
                    sufix = sufix + 1
                    outf = out_file + '_%05d.%s' % (sufix, extention)
                    out_fd = codecs.open(outf, 'w', in_codec)
                    print "%s..." % (outf)
 
                out_fd.write(l)
 
                # print l
                line = line + 1
                if line >= limit:
                    line = 0
        except UnicodeDecodeError:
            gui.QMessageBox.warning(self,"Completed",u"エンコードエラー。エンコードの指定を確認してください。")
            if out_fd:
                out_fd.close()
            if in_fd:
                in_fd.close()
        pass
 
 
def main():
    app = gui.QApplication(sys.argv)
    mainWin = MainWindow()
    sys.exit(app.exec_())
 
if __name__ == '__main__':
    main()

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です