はじめに
PythonでGUI開発をするためのライブラリ「PySide2」の基本的な使い方を、いくつかの段階に分けて説明していきます。
当ページではPySide2のコンボボックスについて説明しています。
公式リファレンス
環境
以下の通りになります。
- Windows 10
- Python 3.8以降
ベースプログラム
以下のウィンドウを表示するだけのプログラムをベースにして実装していきます。
# PySide2のモジュールを読み込む
from PySide2 import QtWidgets
# ウィンドウの見た目と各機能(今はウィンドウだけ)
class MainWindow(QtWidgets.QWidget):
def __init__(self):
super().__init__()
# アプリの実行と終了
app = QtWidgets.QApplication()
window = MainWindow()
window.show()
app.exec_()
PySide2でコンボボックス
コンボボックスの表示
3つ選択肢を持ったコンボボックスを表示してみます。
サンプルプログラム
# PySide2のモジュールを読み込む
from PySide2 import QtWidgets
# ウィンドウの見た目と各機能
class MainWindow(QtWidgets.QWidget):
def __init__(self):
super().__init__()
# コンボボックスオブジェクトの生成
combobox = QtWidgets.QComboBox(self)
# コンボボックスの選択肢を追加
combobox.addItems(["One", "Two", "Three"])
# アプリの実行と終了
app = QtWidgets.QApplication()
window = MainWindow()
window.show()
app.exec_()
実行結果
プログラム解説
ボタンやラベルを表示させる時と同様に、コンボボックスを表示させたいウィンドウオブジェクトを引数に指定します。 基本的に自身のウィンドウに表示させるので ● コンボボックスの選択肢を追加 コンボボックスに選択肢を追加するには 引数 またコンボボックスの表示順は解説を見る
● コンボボックスを表示
QtWidgets.QComboBox()
クラスを用いてコンボボックスを表示させることができます。
書式:
QtWidgets.QComboBox(window_object)
引数:
window_object:
コンボボックスを表示させるウィンドウ
self
を指定すればOKです。# コンボボックスオブジェクトの生成
combobox = QtWidgets.QComboBox(self)
QtWidgets.QComboBox()
だけでは何も選択することのできない空のコンボボックスが表示されるだけなので、選択肢を追加する必要があります。addItems()
またはaddItem()
メソッドを使用します。書式:
一つ追加
QtWidgets.QComboBox.addItem(string)
複数追加
QtWidgets.QComboBox.addItems([string1, string2, string3, ...])
引数:
string:
コンボボックスに登録する選択肢
複数追加する場合はリストまたはタプルで引数を指定する
string
は文字列で指定します。addItem()
・addItems()
で登録した順、またはリスト・タプルの並び順になります。# コンボボックスの選択肢を追加
combobox.addItems(["One", "Two", "Three"])
コンボボックスの選択肢の数を取得
コンボボックスの選択肢の数を取得してみます。ループ処理をさせる場合に使用できそうですね。
サンプルプログラム
# PySide2のモジュールを読み込む
from PySide2 import QtWidgets
# ウィンドウの見た目と各機能
class MainWindow(QtWidgets.QWidget):
def __init__(self):
super().__init__()
# コンボボックスオブジェクトの生成
combobox = QtWidgets.QComboBox(self)
# コンボボックスの選択肢を追加
combobox.addItems(["One", "Two", "Three"])
# コンボボックスの選択数を取得
print(combobox.count())
# アプリの実行と終了
app = QtWidgets.QApplication()
window = MainWindow()
window.show()
app.exec_()
実行結果
プログラム解説
サンプルプログラムでは以下のカ所で選択肢の数を取得しています。解説を見る
● コンボボックスの選択肢の数を取得
QtWidgets.QComboBox()
クラスが持っているcount()
メソッドを用いてコンボボックスの選択肢の数を取得できます。
書式:
QtWidgets.QComboBox.count()
引数:
なし
addItems()
メソッドで登録した選択肢の数を表示しています。# コンボボックスの選択数を取得
print(combobox.count())
選択中の値を取得
コンボボックスで選択されている値を取得してみます。
- コンボボックスから取得できる値
- 文字列
- ID
サンプルプログラム
# PySide2のモジュールを読み込む
from PySide2 import QtWidgets
# ウィンドウの見た目と各機能
class MainWindow(QtWidgets.QWidget):
def __init__(self):
super().__init__()
# コンボボックスオブジェクトの生成
combobox = QtWidgets.QComboBox(self)
# コンボボックスの選択肢を追加
combobox.addItems(["One", "Two", "Three"])
# 選択中の文字列を取得
print(combobox.currentText())
# IDを取得
print(combobox.currentIndex())
# アプリの実行と終了
app = QtWidgets.QApplication()
window = MainWindow()
window.show()
app.exec_()
実行結果
プログラム解説
サンプルプログラムでは以下のように現在選択中のコンボボックスの文字列を取得しています。 ● IDを取得 サンプルプログラムのように現在選択中のコンボボックスのIDを取得しています。 サンプルプログラムを実行した結果、 そんなに難しくはないのですが、単純に選択肢の上から順に0から始まり、1、2、3、…とインクリメントされて番号付けされています。 以下の図のようなイメージです。解説を見る
● 文字列を取得
QtWidgets.QComboBox()
クラスには選択中のコンボボックスの文字列を取得するcurrentText()
メソッドがあります。
書式:
QtWidgets.QComboBox.currentText()
引数:
なし
# 選択中の文字列を取得
print(combobox.currentText())
QtWidgets.QComboBox()
クラスには選択中のコンボボックスのIDを取得するcurrentIndex()
メソッドがあります。書式:
QtWidgets.QComboBox.currentIndex()
引数:
なし
# IDを取得
print(combobox.currentIndex())
0
というIDを取得できましたが、コンボボックスの各々の選択肢にはどのようなIDが割り振られているのでしょうか?
選択肢を削除する
コンボボックスに登録されている選択肢を削除してみます。
サンプルプログラム
# PySide2のモジュールを読み込む
from PySide2 import QtWidgets
# ウィンドウの見た目と各機能
class MainWindow(QtWidgets.QWidget):
def __init__(self):
super().__init__()
# コンボボックスオブジェクトの生成
combobox = QtWidgets.QComboBox(self)
# コンボボックスの選択肢を追加
combobox.addItems(["One", "Two", "Three"])
# 真ん中の選択肢 "Two" を削除 (コンボボックスのIDで指定)
combobox.removeItem(1)
# アプリの実行と終了
app = QtWidgets.QApplication()
window = MainWindow()
window.show()
app.exec_()
実行結果
プログラム解説
コンボボックスの選択肢のIDを サンプルプログラムでは選択肢の2番目(IDは 1)を削除しています。解説を見る
● コンボボックスの選択肢を削除
QtWidgets.QComboBox()
クラスのremoveItem()
メソッドでコンボボックスに登録されている選択肢を削除することができます。
書式:
QtWidgets.QComboBox.removeItem(id)
引数:
id:
削除対象となるコンボボックスの選択肢のID
removeIten()
メソッドの引数に指定すれば、そのIDに該当する選択肢を削除することができます。コンボボックスのIDは先頭(一番上)から順に0、1、2、3、…と番号付けされています。またcurrentIndex()
メソッドで選択中の選択肢IDを取得できます。# 真ん中の選択肢 "Two" を削除 (コンボボックスのIDで指定)
combobox.removeItem(1)
コンボボックスの選択欄を入力可能にする
コンボボックスの選択欄を入力可能にしてみます。入力できるようにすると以下のメリットが得られます。
- 入力可能にすることのメリット
- 選びたい選択肢の検索
- 項目にはない選択肢の追加
サンプルプログラム
# PySide2のモジュールを読み込む
from PySide2 import QtWidgets
# ウィンドウの見た目と各機能
class MainWindow(QtWidgets.QWidget):
def __init__(self):
super().__init__()
# コンボボックスオブジェクトの生成
combobox = QtWidgets.QComboBox(self)
# コンボボックスの選択肢を追加
combobox.addItems(["One", "Two", "Three"])
# コンボボックス欄の入力を有効
combobox.setEditable(True)
# アプリの実行と終了
app = QtWidgets.QApplication()
window = MainWindow()
window.show()
app.exec_()
実行結果
ちなみにコンボボックス欄の入力を可能にするだけで、候補検索も自動的にやってくれるようになります。
プログラム解説
この サンプルプログラムでは単にコンボボックスの入力を可能にしているだけです。 ● 新しい項目を追加 簡単ですね。ただし解説を見る
● コンボボックス欄の入力を可能にする
QtWidgets.QComboBox()
クラスで作成したコンボボックスオブジェクトにはsetEditable()
メソッドがあります。
setEditable()
メソッドの引数にTrue/False
を指定することでコンボボックス欄の入力可否を設定します。書式:
QtWidgets.QComboBox.setEditable(bool)
引数:
bool:
「True」または「False」を指定。
入力可能にする場合はTrueを引数に指定。
# コンボボックス欄の入力を有効
combobox.setEditable(True)
新規項目を追加する手順は以下になります。
Enter
を押して項目の追加が完了Enter
を押さないと項目の追加がされませんので注意を。
実際に追加している様子を以下に掲載しています。
選択肢が変更された瞬間に処理を実行する
コンボボックスの選択肢を変更したらある関数を実行してみます。
サンプルプログラム
# PySide2のモジュールを読み込む
from PySide2 import QtWidgets
# ウィンドウの見た目と各機能
class MainWindow(QtWidgets.QWidget):
def __init__(self):
super().__init__()
# コンボボックスオブジェクトの生成
self.combobox = QtWidgets.QComboBox(self)
# コンボボックスの選択肢を追加
self.combobox.addItems(["One", "Two", "Three"])
# コンボボックスの選択肢が変更されたら呼び出す関数
self.combobox.currentIndexChanged.connect(self.notice_changed)
# 呼び出される関数
def notice_changed(self):
print("Changed!!")
# アプリの実行と終了
app = QtWidgets.QApplication()
window = MainWindow()
window.show()
app.exec_()
実行結果
プログラム解説
この スロット関数を呼び出すには 書式は以下の通りになります。 サンプルプログラムでは選択肢が変更されたらコンソールに「Changed!!」と表示する解説を見る
● 選択肢が変更されたら関数を実行
QtWidgets.QComboBox()
クラスで生成したコンボボックスオブジェクトにはcurrentIndexChanged
というシグナルがあります。
currentIndexChanged
シグナルは、コンボボックスの現在の選択肢が変更されたことを検知し、スロット関数を呼び出します。connect()
メソッドを使用します。書式:
QtWidgets.QComboBox.currentIndexChanged.connect(Slot_Function)
引数:
Slot_Function:
スロット関数
コンボボックスの選択肢が変更されたら実行したい関数
notice_changed
関数を呼び出すようにしています。# コンボボックスの選択肢が変更されたら呼び出す関数
self.combobox.currentIndexChanged.connect(self.notice_changed)