今月は梅雨だけあって、実にジメジメとした暑い日々でした。
まあこの時期に雨が降らないと、作物の育成や水不足など
色々なところに問題が出てくるので、必要ではあるんですけどね…。
さて表題の件です。
自分はちょっとしたことをプログラムで実行したい時、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を使う意味はほぼ無いという。残念。
以上