takuroooのブログ

勉強したこととか

Qt for Python Exif Viewer

QTreeWidgetとQTextEditとQSplitterとQStackedWidgetを使ってExifViewerを作った。

f:id:takuroooooo:20200729223518p:plain

github.com

以前作ったViewerはQTreeWidgetメインでGUIを作成したが、今回はQSplitterとQStackedWidgetを使ってページが切り替わるようなUIにした。

自作ExifParser

UI以外の変更点として、前回はPILの_getexif()を使ってExifを取得していたが、今回はExifのParserを自作した。

ExifViewer/exif_reader.py at master · takurooo/ExifViewer · GitHub

下記のように書くとExifのtagの名前と値をプリントすることができる。

from common.exif_reader import ExifReader
exif_reader = ExifReader(path_to_your_jpegfile) # Parse exif tags
ifds =exif_reader.get_exif()
for ifd_name, ifd in ifds.items():
    for tag_name, tag in ifd.items():
        print(tag_name, tag.val)

またテキストにExif情報を出力することもできる。

from common.exif_reader import ExifReader
exif_reader = ExifReader(path_to_your_jpegfile) # Parse exif tags
exif_reader.save_log(text_file_path)

このテキスト保存機能はExifViewerのメニューバーにあるSaveボタンを押すと実行するようにしてある。

PySide2 メニューバーとアイコン

Qtではメニューアイコンがデフォルトで用意されている。
メニューバーとアイコンの設定は_make_toolbar()で実行している。

ExifViewer/exif_viewer.py at master · takurooo/ExifViewer · GitHub

    def _make_toolbar(self):
        save_icon = QApplication.style().standardIcon(QStyle.SP_DialogSaveButton)
        save_action = QAction(icon=save_icon, text='save', parent=self)
        save_action.triggered.connect(self._save_text)

        exit_icon = QApplication.style().standardIcon(QStyle.SP_DialogCloseButton)
        exit_action = QAction(icon=exit_icon, text='exit', parent=self)
        exit_action.triggered.connect(self._quit)

        # ツールバー作成
        self.toolbar = self.addToolBar('tool bar')
        self.toolbar.setIconSize(QSize(35, 35))
        self.toolbar.setFixedHeight(35)
        self.toolbar.addAction(save_action)
        self.toolbar.addAction(exit_action)

save_action.triggered.connect(self._save_text)でボタンが押された時に実行される関数を設定している。
QtではSignalとSlotという考え方がある。ユーザーがボタンを押したりするとSignalが発行され、Signalに紐づいたSlot(関数)が実行される。
save_action.triggered.connect(self._save_text)はSignalとSlotの紐付けを行なっている。

Qt for Python Signals and Slots - Qt Wiki