PySide (Qt for Python) は、Qt(キュート)の Python バインディングで、GUI などを構築するためのクロスプラットフォームなライブラリです。配布ライセンスは LGPL で公開されています(商用ライセンスも有り)。最新のバージョンは Qt6 に対応した PySide6(記事執筆時点で 6.5.2)です。
PySide6 で GUI アプリを作る時に、まずは使い慣れた Linux 上で開発をはじめて、他の人にも使ってもらえる段階になったら、Windows 上で動作確認をしてから PyInstaller でパッケージにする、というようなやりかたをよくしています。
PySide6 を利用した GUI は、異なるプラットフォーム間で問題なく動作させられますが、ファイル構造は OS によって違いがあります。そのため、アプリが必要とする設定ファイルや一時ファイルなどの保存先を決めるときには、なんとなく無難に OS に依存しない場所にするか、python の platform モジュールを利用して OS を判定して、判定に応じて保存場所を決めたりしていました。
PySide6 では QStandardPaths [1] という便利なクラスを利用できることを知りました。このクラスには、ユーザー固有のディレクトリやシステム全体の設定ディレクトリといった一般的なタスクのために、ローカル・ファイルシステム上の標準的な場所を問い合わせる関数が用意されています。
早速内容を確認するために QStandardPaths.StandardLocation という列挙型がメンバーとして保持している定数の一覧を表示するサンプルを作ってみました。
import sys | |
from PySide6.QtCore import QStandardPaths | |
from PySide6.QtWidgets import ( | |
QApplication, | |
QFrame, | |
QGridLayout, | |
QLabel, | |
QScrollArea, | |
QSizePolicy, | |
QWidget, | |
) | |
class Example(QScrollArea): | |
def __init__(self): | |
super().__init__() | |
self.setWidgetResizable(True) | |
self.init_ui() | |
self.setWindowTitle('Standard Location') | |
def init_ui(self): | |
base = QWidget() | |
base.setSizePolicy( | |
QSizePolicy.Expanding, | |
QSizePolicy.Expanding | |
) | |
self.setWidget(base) | |
layout = QGridLayout() | |
layout.setContentsMargins(0, 0, 0, 0) | |
layout.setSpacing(0) | |
base.setLayout(layout) | |
names = sorted( | |
[attr for attr in dir(QStandardPaths.StandardLocation) if not attr.startswith('__')] | |
) | |
row = 0 | |
for name in names: | |
enum_stdloc = getattr(QStandardPaths.StandardLocation, name) | |
list_loc = QStandardPaths.standardLocations(enum_stdloc) | |
span = len(list_loc) | |
label_name = QLabel(name) | |
label_name.setFrameStyle( | |
QFrame.Shape.StyledPanel | QFrame.Shadow.Raised | |
) | |
label_name.setLineWidth(2) | |
label_name.setSizePolicy( | |
QSizePolicy.Policy.Preferred, | |
QSizePolicy.Policy.Expanding | |
) | |
label_name.setStyleSheet(""" | |
QLabel { | |
padding:0.1em 0.2em; | |
} | |
""") | |
layout.addWidget(label_name, row, 0, span, 1) | |
for idx, loc in enumerate(list_loc): | |
label_value = QLabel(loc) | |
label_value.setFrameStyle( | |
QFrame.Shape.StyledPanel | QFrame.Shadow.Sunken | |
) | |
label_value.setLineWidth(2) | |
label_value.setSizePolicy( | |
QSizePolicy.Policy.Expanding, | |
QSizePolicy.Policy.Expanding | |
) | |
label_value.setStyleSheet(""" | |
QLabel { | |
padding:0.1em 0.2em; | |
background-color:white; | |
} | |
""") | |
layout.addWidget(label_value, row + idx, 1, 1, 1) | |
row += span | |
def main(): | |
app = QApplication(sys.argv) | |
ex = Example() | |
ex.show() | |
sys.exit(app.exec()) | |
if __name__ == '__main__': | |
main() |
Fedora Workstation 39(プレリリース版)+ Python 3.11 で実行した例を示しました。
以下は Windows 11 上で実行した例です。
これらの情報を参照するだけで十分であれば、プログラムは、稼働しているプラットフォームを意識する必要がなくなります。
参考サイト

にほんブログ村
#オープンソース

0 件のコメント:
コメントを投稿