Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What is going on with this article?
@karakuri-t910

PySide2をゼロから学んでいく~#6 コンボボックス~

はじめに

PythonでGUI開発をするためのライブラリ「PySide2」の基本的な使い方を、いくつかの段階に分けて説明していきます。

当ページではPySide2のコンボボックスについて説明しています。

公式リファレンス

QComboBox

環境

以下の通りになります。

  • 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_()

実行結果

000.png

プログラム解説

解説を見る

● コンボボックスを表示
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_()

実行結果

001.png

プログラム解説

解説を見る

● コンボボックスの選択肢の数を取得
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_()

実行結果

002.png

プログラム解説

解説を見る

● 文字列を取得
QtWidgets.QComboBox()クラスには選択中のコンボボックスの文字列を取得するcurrentText()メソッドがあります。
書式:
     QtWidgets.QComboBox.currentText()
引数:
    なし

サンプルプログラムでは以下のように現在選択中のコンボボックスの文字列を取得しています。

# 選択中の文字列を取得
print(combobox.currentText())

● IDを取得
QtWidgets.QComboBox()クラスには選択中のコンボボックスのIDを取得するcurrentIndex()メソッドがあります。

書式:
     QtWidgets.QComboBox.currentIndex()
引数:
    なし

サンプルプログラムのように現在選択中のコンボボックスのIDを取得しています。

# IDを取得
print(combobox.currentIndex())

サンプルプログラムを実行した結果、0というIDを取得できましたが、コンボボックスの各々の選択肢にはどのようなIDが割り振られているのでしょうか?

そんなに難しくはないのですが、単純に選択肢の上から順に0から始まり、1、2、3、…とインクリメントされて番号付けされています

以下の図のようなイメージです。

aaa.png

選択肢を削除する

コンボボックスに登録されている選択肢を削除してみます。

サンプルプログラム

# 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_()

実行結果

003.png

プログラム解説

解説を見る

● コンボボックスの選択肢を削除
QtWidgets.QComboBox()クラスのremoveItem()メソッドでコンボボックスに登録されている選択肢を削除することができます。
書式:
    QtWidgets.QComboBox.removeItem(id)
引数:
    id:
        削除対象となるコンボボックスの選択肢のID

コンボボックスの選択肢のIDをremoveIten()メソッドの引数に指定すれば、そのIDに該当する選択肢を削除することができます。コンボボックスのIDは先頭(一番上)から順に0、1、2、3、…と番号付けされています。またcurrentIndex()メソッドで選択中の選択肢IDを取得できます。

サンプルプログラムでは選択肢の2番目(IDは 1)を削除しています。

# 真ん中の選択肢 "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_()

実行結果

ちなみにコンボボックス欄の入力を可能にするだけで、候補検索も自動的にやってくれるようになります。

000.gif

プログラム解説

解説を見る

● コンボボックス欄の入力を可能にする
QtWidgets.QComboBox()クラスで作成したコンボボックスオブジェクトにはsetEditable()メソッドがあります。

このsetEditable()メソッドの引数にTrue/Falseを指定することでコンボボックス欄の入力可否を設定します。

書式:
    QtWidgets.QComboBox.setEditable(bool)
引数:
    bool:
        「True」または「False」を指定。
        入力可能にする場合はTrueを引数に指定。

サンプルプログラムでは単にコンボボックスの入力を可能にしているだけです。

# コンボボックス欄の入力を有効
combobox.setEditable(True)

● 新しい項目を追加
新規項目を追加する手順は以下になります。

  1. コンボボックスに追加したい項目を入力
  2. 入力後Enterを押して項目の追加が完了

簡単ですね。ただしEnterを押さないと項目の追加がされませんので注意を。
実際に追加している様子を以下に掲載しています。

001.gif

選択肢が変更された瞬間に処理を実行する

コンボボックスの選択肢を変更したらある関数を実行してみます。

サンプルプログラム

# 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_()

実行結果

002.gif

プログラム解説

解説を見る

● 選択肢が変更されたら関数を実行
QtWidgets.QComboBox()クラスで生成したコンボボックスオブジェクトにはcurrentIndexChangedというシグナルがあります。

このcurrentIndexChangedシグナルは、コンボボックスの現在の選択肢が変更されたことを検知し、スロット関数を呼び出します。

スロット関数を呼び出すにはconnect()メソッドを使用します。

書式は以下の通りになります。

書式:
QtWidgets.QComboBox.currentIndexChanged.connect(Slot_Function)
引数:
    Slot_Function:
        スロット関数
        コンボボックスの選択肢が変更されたら実行したい関数

サンプルプログラムでは選択肢が変更されたらコンソールに「Changed!!」と表示するnotice_changed関数を呼び出すようにしています。

# コンボボックスの選択肢が変更されたら呼び出す関数
self.combobox.currentIndexChanged.connect(self.notice_changed)

1
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
karakuri-t910
介護職をやっております。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
1
Help us understand the problem. What is going on with this article?