ライブラリ紹介
QT が戦略的に失敗したからといって、QT が良いフレームワークではないということにはならない
QT は少なくとも使いやすいフレームワークだと思っています。特に Python と組み合わせたときはそう感じます。
よく「人生は短い、私は Python を使う」と言われます。要するに「ゴミコードでも動けばいい」というスタンスですが、PyQt ならごく短時間で十分実用的なデスクトップツールを作れます。
もちろん、私の信条では「動くだけ」では足りません。せめて UI は目が痛くないものであってほしいです。
そんな中、今回の主役が堂々と登場します。zhiyiYo (之一) さんによるコンポーネントライブラリです。
この方は自作のブログ用フレームワークも公開していますが、それは「簡潔でありながら単純ではない」というタイプではありません。
デモプログラムの動作を軽くキャプチャしてみました(gif は気にしないでください)。実際の出来栄えは非常に良いです。
Windows ネイティブのデザイン言語にかなり近いです。それくらい近いので、私もわざわざ Microsoft の Fluent UI のデザインガイドラインまで調べたくらいです。これが QT で実装されているとはにわかに信じがたいです。

240719 200839
使い方
公式ドキュメントに詳しい説明があります。ここで特に注意してほしいのは、個人的には pyside2 を推すということです。QT 系には今も著作権上の論争がありますし、私たちのようなエンジニアが、よりモダンで高度なコンポーネント機能を必要とすることはほとんどありません。pyside2 で十分です。世代が違うと構文や API が少しずつ異なるので、最初に最適なフレームワークを決めておかないと、後々面倒なことになります。
pip install "PySide2-Fluent-Widgets[full]" -i https://pypi.org/simple/
もう 1 つ注意点です。コンポーネントライブラリは混用しないほうがいいです。別に見た目を整えるライブラリを追加するなら、QSS を置き換えるタイプのものだけにするのがおすすめです。QSS の置き換えでさえ、原因不明の競合が起きることもあります。今のところ、色だけを置き換えられるライブラリは見つけられていません。
組み合わせて使えるライブラリ
QSS を変更するライブラリ
QT-Fluent-Widgets は、すべてのコンポーネントをそのフレームワークの中で使って初めて、優れた表示効果が得られます。自作コンポーネントを使うとかなり不便です。Fluent のスタイルだけ使って、自分でカスタマイズした機能を持つコンポーネントを使いたい場合は、Qt-Material を組み合わせることができます。
pip install qt-material
Qt-Material は優先度が非常に高いので、Fluent の QSS を完全に上書きします。
データベースコンポーネント
Redis を使ってフロントエンドとバックエンドを分離します。
Redis には次のようなポータブル版があります。

このポータブル版には実行ファイルが含まれているので、バックエンドのソースコードに組み込んで、ちょっとしたラッパーをかぶせます。
import subprocess
import redis
import os
class uRedisServer():
def __init__(self):
# Redis服务器和配置文件的路径
self.redis_server_path = os.path.join(".", "ExTools/Redis", "redis-server.exe")
self.redis_conf_path = os.path.join(".", "ExTools/Redis", "redis.windows.conf")
self.redis_port = 6379
# Redis服务器进程的保存,便于后期操作此进程
self.RedisProcess = None # 用于存储Redis进程
def Open(self):
try:
self.RedisProcess = subprocess.Popen([self.redis_server_path, self.redis_conf_path], stdout=subprocess.PIPE)
return True
except Exception as e:
return False
def Close(self):
try:
if self.RedisProcess is None:
return False
self.RedisProcess.terminate() # 尝试优雅地关闭Redis服务器
self.RedisProcess = None
except Exception as e:
return False