フォームアプリケーションを作るなら開発環境は必要

今月は梅雨だけあって、実にジメジメとした暑い日々でした。
まあこの時期に雨が降らないと、作物の育成や水不足など
色々なところに問題が出てくるので、必要ではあるんですけどね…。


さて表題の件です。
自分はちょっとしたことをプログラムで実行したい時、Pythonを使用することがあります。
目的が小規模なアプリなので、専用の開発環境を用意することなくテキストエディタで
ささっと書きますし、言うまでもなくコンソールアプリの形となります。

ではPythonでフォームアプリケーションを作ることは可能?
当然、作る方法はあるようです。興味本位で試作してみることに。

GUIライブラリには色々あるようですが、今回は「PySide6」を使用。

画面を表示させ、ラベル、テキストボックス、ボタンなどを追加して、と
コードを組んでみました。

# -*- encoding: shift-jis -*-
import asyncio
import PySide6
from PySide6.QtCore import (QAbstractListModel, Qt)
from PySide6.QtWidgets import (QApplication,
                               QLabel,          # ラベル
                               QButtonGroup,    # ボタングループ
                               QPushButton,     # ボタン
                               QRadioButton,    # ラジオボタン
                               QLineEdit,
                               QTextEdit,       # 入力欄
                               QComboBox,       # コンボボックス
                               QListView,
                               QWidget)
import os
import sys

# ListViewに項目を追加するためのクラス
class TodoModel(QAbstractListModel):
    def __init__(self, todos=None):
        super().__init__()
        self.todos = todos or []

    def data(self, index, role):
        if role == Qt.DisplayRole:
            status, text = self.todos[index.row()]
            return text

    def rowCount(self, index):
        return len(self.todos)

    #def Clear(self):
    #    return self.todos.clear()

class MainWindow(QWidget):
    def __init__(self, parent=None):
        # 親クラスの初期化
        super().__init__(parent)
        
        # ウィンドウタイトル、サイズ
        self.setWindowTitle("OCPP Server ツール")
        self.resize(800, 600)
        #self.setGeometry(50, 50, 800, 600)
        
        # 各種オブジェクトを表示
        self.SetObject()
        
    def SetObject(self):
        # ラジオボタングループ
        self.radioGroup = QButtonGroup(self)
        
        # 1つ目のラジオボタン
        self.radio1 = QRadioButton(self)
        self.radio1.setText("OCPP1.6")
        self.radio1.move(60, 10)
        self.radioGroup.addButton(self.radio1)    # グループに登録
        
        # 2つ目のラジオボタン
        self.radio2 = QRadioButton(self)
        self.radio2.setText("OCPP2.0.1")
        self.radio2.move(150, 10)
        self.radioGroup.addButton(self.radio2)    # グループに登録
        
        # 1つ目のラジオボタンを初期入力状態にする
        self.radio1.setChecked(True)
        
        # ラベル
        lbl = QLabel(self)
        lbl.move(10, 40)
        lbl.setText("接続URL")
        lbl = QLabel(self)
        lbl.move(10, 78)
        lbl.setText("コマンド")
        
        # テキストボックス
        self.lineEdit = QLineEdit(self)
        self.lineEdit.move(60, 35)
        self.lineEdit.resize(610, 25)
        self.lineEdit.setText("wss://127.0.0.1/TestConnect")
        
        # コンボボックスを使うことを宣言
        self.combobox = QComboBox(self)
        self.combobox.move(60, 75)
        self.combobox.resize(610, 25)
        self.combobox.setEditable(False) # 入力を無効
        
        # テキストエリア
        self.textArea = QTextEdit(self)
        self.textArea.move(60, 105)
        self.textArea.resize(610, 380)
        self.textArea.setText("コマンド内容表示エリア")
        
        # ログ出力用
        self.model = TodoModel(todos=[(False, 'ログ表示エリア')])
        self.listArea = QListView(self)
        self.listArea.move(60, 495)
        self.listArea.resize(610, 90)
        self.listArea.setModel(self.model)
        
        # 1つ目のボタン
        self.btnAccept = QPushButton(self)
        self.btnAccept.setText("接続待ち")
        self.btnAccept.move(685, 5)
        self.btnAccept.resize(100, 55)
        
        # 2つ目のボタン
        self.btnLogClear = QPushButton(self)
        self.btnLogClear.setText("ログクリア")
        self.btnLogClear.move(685, 495)
        self.btnLogClear.resize(100, 55)
        
        # 3つ目のボタン
        self.btnSend = QPushButton(self)
        self.btnSend.setText("コマンド送信")
        self.btnSend.move(685, 105)
        self.btnSend.resize(100, 55)

if __name__ == "__main__":
    # 環境変数にPySide6を登録
    dirname = os.path.dirname(PySide6.__file__)
    plugin_path = os.path.join(dirname, 'plugins', 'platforms')
    os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = plugin_path
    
    app = QApplication(sys.argv)    # PySide6の実行
    window = MainWindow()
    window.show()                   # PySide6のウィンドウを表示
    sys.exit(app.exec())            # PySide6の終了

実行した結果はこちら。

うん、まあそれっぽい画面は出来ました。
ただ、フォームアプリケーションはここからボタン押下時のイベントを追加とか、
スレッドセーフなプログラムにするためにひと工夫入れたりとかが必要。
やることが…やることが多い。

本格的にフォームアプリケーションを作成するなら、やはりそれに見合った
開発環境を用意する必要があると感じました。

そもそも、フォームアプリケーションで色々やるならVisualStudioを使って
C#あたりで組んだ方が余程お手軽なんですよね
分かってはいましたが、Pythonを使う意味はほぼ無いという。残念。

以上