「Krita」と「Python」でUIパーツを構築してみよう
はじめに
前回は、UIの中でもファイルダイアログなどの様々なダイアログUIの構築方法を解説しました。今回はまっさらなダイアログに貼り付けるボタンやスライダーなどのUIパーツの構築方法を解説します。
なお、前回のUIは最初から決まったフォーマットのレイアウトが用意されていましたが、今回はオリジナルのレイアウトのダイアログを作成します。例えば、スライダーを移動するとスライダーの数値がラインエディットに表示されるようなレイアウトです。
clickedで処理するUIパーツを構築する
今回解説するUIパーツは「ラベル」「ボタン」「カレンダー」「ラジオボタン」「リストビュー」「テキストエディット」「コンボボックス」「スピンボックス」「ラインエディット」「スライダー」「チェックボックス」です。いずれも前回で最初に解説した素のダイアログ「QDialog」に貼り付けます。今回も「クラス(class)」については解説しませんが、後に今回のUIパーツとほぼ同じスクリプトをクラスを多用して(「継承」させて使います)構築する際に改めて解説します。
今回は代表的なUIパーツだけを解説しますが、他にもUIパーツはたくさん存在します。次のURLを参考に他のウィジェットも実装してみてください。
・Qt for Python(ただしこのURLのQtのほうがバージョンが新しいです)
https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/
ラベルを構築
「ラベル(QLabel)」とは「はり紙」のことです。つまり文字を書いて説明書きなどをする際に使います。他にも操作に応じて説明を変えたり、入力した値を表示したりできます(図1)。
基本的に「レイアウト」クラス(ここでは「QHBoxLayout」クラス)のインスタンスにラベルUIを追加(addWidget)し、それをダイアログにセット(setLayout)して表示します。これは以降のUIパーツで共通です。
・サンプルスクリプト「dlg_label.py」# モジュール from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QDialog, QHBoxLayout, QLabel # ラベルの作成 layout = QHBoxLayout() label = QLabel("ラベル") layout.addWidget(label) layout.setAlignment(label,Qt.AlignHCenter) # ダイアログの作成と実行 dlg = QDialog() dlg.setLayout(layout) dlg.setWindowTitle("ラベル") dlg.resize(200,200) dlg.exec_()
【サンプルスクリプトの解説】
「PyQt5」内のモジュールを読み込みます。
水平にUIパーツを並べる「QHBoxLayout」クラスのレイアウトを作成してラベルUIを追加します。ラベルは水平において中央に整列(setAlignment)します。
QDialogクラスのダイアログ作成は前回同様です。今回は幅高さを200x200にリサイズ(resize)します。
ボタンを構築
「ボタン(QPushButton)」とは「押しボタン」です(図2)。ボタンを押すと処理を実行することができます。
・サンプルスクリプト「dlg_button.py」# モジュール from PyQt5.QtWidgets import QDialog, QHBoxLayout, QPushButton # ボタンが押されたら呼ばれる def click_button(): print("ボタンが押されました!") # ボタンUIの作成 layout = QHBoxLayout() button = QPushButton("ボタンを押してください") layout.addWidget(button) # ボタンが押されたら「click_button」関数を呼び出す button.clicked.connect(click_button) # ダイアログの作成と実行 dlg = QDialog() dlg.setLayout(layout) dlg.exec_()
【サンプルスクリプトの解説】
「PyQt5」内のモジュールを読み込みます。
「click_button」関数で"ボタンが押されました!"をコンソールに表示します。
「QPushButton」クラスでボタンUIを作成してレイアウトに追加し、ダイアログにセットします。
ボタンが押されたら(clicked)、「click_button」関数を呼び出します。
カレンダーを構築
「カレンダー(QCalendarWidget)」は「暦」のことです。月ごとに28~31日ずつ日曜日から土曜日まである普通のカレンダーです(図3)。
・サンプルスクリプト「dlg_calendar.py」# モジュール from PyQt5.QtWidgets import QDialog,QStackedLayout,QCalendarWidget # カレンダーが押されたら呼ばれる def click_calendar(value): year = str(value.year()) month = str(value.month()) day = str(value.day()) print(year+"年"+month+"月"+day+"日") # カレンダーUIの作成 layout = QStackedLayout() calendar = QCalendarWidget() layout.addWidget(calendar) # カレンダーが押されたら「click_calendar」関数を呼び出す calendar.clicked.connect(click_calendar) # ダイアログの作成と実行 dlg = QDialog() dlg.setLayout(layout) dlg.exec_()
【サンプルスクリプトの解説】
「PyQt5」内のモジュールを読み込みます。
「click_calendar」関数で、クリックした年月日をコンソールに表示します。
「QCalendarWidget」クラスでカレンダーUIを作成してレイアウトに追加し、ダイアログセットします。
カレンダーが押されたら(clicked)、「click_calendar」関数を呼び出します。
ラジオボタンを構築
「ラジオボタン(QRadioButton)」は、複数の選択肢のうちの1つだけを選べる項目1個1個のボタンのことです(図4)。複数のボタンを同時に選べるようにする場合は「チェックボックス」を使います。
・サンプルスクリプト「dlg_radiobutton.py」# モジュール from PyQt5.QtWidgets import QDialog,QGroupBox,QVBoxLayout,QRadioButton # ラジオボタンが押されたら呼ばれる def click_radio1(): print("ラジオボタン1が押された") def click_radio2(): print("ラジオボタン2が押された") def click_radio3(): print("ラジオボタン3が押された") # ラジオボタンUIの作成 groupBox = QGroupBox("1個だけ選択") radio1 = QRadioButton("ラジオボタン1") radio2 = QRadioButton("ラジオボタン2") radio3 = QRadioButton("ラジオボタン3") radio1.setChecked(True) vbox = QVBoxLayout() vbox.addWidget(radio1) vbox.addWidget(radio2) vbox.addWidget(radio3) vbox.addStretch(1) groupBox.setLayout(vbox) layout = QVBoxLayout() layout.addWidget(groupBox) # ラジオボタンが押されたら関数を呼び出す radio1.clicked.connect(click_radio1) radio2.clicked.connect(click_radio2) radio3.clicked.connect(click_radio3) # ダイアログの作成と実行 dlg = QDialog() dlg.setLayout(layout) dlg.exec_()
【サンプルスクリプトの解説】
「PyQt5」内のモジュールを読み込みます。
「click_radio1」「click_radio2」「click_radio3」関数でラジオボタン1、2、3が押されたことをコンソールに表示します。
「QRadioButton」クラスでラジオボタンUIを作成し、垂直にUIパーツを並べる「QVBoxLayout」レイアウトに追加して「QGroupBox」クラスにセットします。これをレイアウトに追加してダイアログにセットします。
ラジオボタンが押されたら(clicked)、「click_radio1」か「click_radio2」か「click_radio3」関数を呼び出します。
リストビューを構築
「リストビュー(QListView)」は「一覧表」のことで、Microsoft Office Excelの表に似ています(図5)。ただ大抵1列しかない一覧表です。
・サンプルスクリプト「dlg_listview.py」# モジュール from PyQt5.QtCore import QStringListModel from PyQt5.QtWidgets import QDialog, QHBoxLayout, QListView # リスト fruit_list = ['りんご', 'バナナ', 'イチゴ'] # リストビューが押されたら def click_listview(index): print(fruit_list[index.row()]) # リストビューUIの構築 model = QStringListModel(fruit_list) view = QListView() view.setModel(model) layout = QHBoxLayout() layout.addWidget(view) # リストビューがクリックされたら「click_listview」を呼び出す view.clicked.connect(click_listview) # ダイアログの作成と実行 dlg = QDialog() dlg.setLayout(layout) dlg.setWindowTitle("Dialog") dlg.exec_()
【サンプルスクリプトの解説】
「PyQt5」内のモジュールを読み込みます。
「click_listview」関数でクリックした項目をコンソールに表示します。
「QStringListModel」で項目のリストをモデルに追加します。
「QListView」クラスでリストビューUIを作成し「setModel」メソッドでモデルをセットします。
リストビューをレイアウトに追加し、ダイアログにセットします。
リストビューが押されたら(clicked)、「click_listview」関数を呼び出します。