1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PythonからDelphiのWindows GUIを使う ― DelphiVCLの基本・公式サンプル・アプリ作成

1
Posted at

PythonからDelphiのWindows GUIを使う ― DelphiVCLの基本・公式サンプル・アプリ作成

はじめに

PythonでWindows向けのデスクトップアプリを作ろうとすると、まずTkinterやPySide6などが候補に挙がります。もう一つ覚えておきたいのが、DelphiVCL for Python です。

DelphiVCLは、Delphiで長く使われてきたGUIフレームワーク「VCL(Visual Component Library)」をPythonから利用できるようにしたモジュールです。Windowsの標準的な操作感を持つウィンドウを作り、ボタンを押したらPythonの関数を呼び出す、といったプログラムを書けます。

本記事では、DelphiVCLの仕組みを確認したあと、公式サンプルとデモの場所、インストール方法、簡単なGUIアプリの作成まで進めます。後半では、CSVやデータベースを使う業務ツールへの応用も考えてみます。

なお、DelphiVCLはWindows専用です。Linuxで動くPython GUIライブラリではない点には注意してください。

確認日:2026年10月27日
PyPIで確認できるdelphivclの公開版は**1.0.7(2025年3月31日公開)**です。パッケージの配布状況は変更されることがあるため、導入時はPyPIでも確認してください。

1. DelphiVCLとは

DelphiのGUIをPythonから利用する

Delphiでは、フォームにボタンや入力欄を配置し、操作に応じて処理を実行するWindowsアプリを開発できます。DelphiVCLを使うと、そのVCLのコンポーネントをPythonから扱えます。

例えば次のような部品が利用できます。

コンポーネント 役割 使用例
Form ウィンドウ メイン画面
Label 文字表示 項目名、説明
Edit 1行入力 検索条件、観測所名
Button ボタン 実行、登録、保存
ListBox リスト表示 ファイル、地点の一覧
ComboBox 選択欄 対象地点や処理方式の切り替え
CheckBox チェック欄 オプション指定
PageControl タブ画面 設定画面の分類
TreeView 階層表示 データフォルダー、プロジェクト構成
StringGrid 表形式の表示 検索結果や時系列データ
OpenDialog / SaveDialog ファイル選択 CSVの読み込みと保存
StatusBar 状態表示 処理件数、メッセージ

ここに挙げたものは、DelphiVCLのAPIリファレンスに掲載されているコンポーネントの一部です。Delphi本体にある全コンポーネントや市販のVCLコンポーネントが、Pythonから無条件に使えるわけではありません。

Python4Delphiとの違い

DelphiVCLの内部では、DelphiとPythonを橋渡しする Python4Delphi が使われています。ここは名前が似ていて混同しやすい部分です。

  • DelphiVCL:PythonからWindows向けのVCLコンポーネントを使うためのモジュールです。
  • Python4Delphi:DelphiとPythonを連携させるための基盤です。Delphi側からPythonを呼び出す用途も含みます。
  • DelphiFMX:FireMonkey(FMX)を使った、複数OS向けGUIの別モジュールです。
  • Delphi4PythonExporter:Delphiのフォームデザイナーで作った画面を、Python向けに出力するツールです。

DelphiVCLで簡単な画面を作るだけなら、Delphi IDEを別途導入する必要はありません。Pythonコードでフォームやボタンの配置を記述できます。

fig01_delphivcl_architecture.png

図1:DelphiVCLの位置付け。PythonからDelphiのVCLを経由し、WindowsのGUIを利用します。

2. 動作環境とインストール

対応環境

現在配布されているパッケージの主な対象は次のとおりです。

項目 内容
OS Windows
CPUアーキテクチャ x86(32bit)/ x86-64(64bit)
Python CPython 3.8~3.13に対応するwheelが公開されています
インストール方法 pip(venv、conda環境でも利用可能)
Delphi IDE PythonコードによるGUI開発だけなら不要

公式ドキュメントの一部には、以前のPython対応範囲が残っています。ここでは2026年10月27日時点でPyPIに掲載されているwheelの情報を基準にしています。

Windows 11では、まず64bit版Python 3.12で試すとよいでしょう。以下はWindows PowerShellで実行します。WSL2のUbuntuターミナルではありません。

# 作業フォルダー
mkdir delphivcl_test
cd delphivcl_test

# Python 3.12を利用する仮想環境
py -3.12 -m venv .venv

# PowerShellの実行ポリシーを変更せずに、仮想環境内のPythonを直接使用
.\.venv\Scripts\python.exe -m pip install --upgrade pip
.\.venv\Scripts\python.exe -m pip install delphivcl==1.0.7

# インポートを確認
.\.venv\Scripts\python.exe -c "from delphivcl import Form, Button; print(Form, Button)"

エラーになった場合は、利用中のPythonのバージョンと32bit/64bitの組み合わせを確認してください。

.\.venv\Scripts\python.exe --version
.\.venv\Scripts\python.exe -c "import platform; print(platform.architecture())"

3. まずは最小のウィンドウを表示する

最初はボタンも入力欄もないウィンドウを作ります。公式Quickstartと同じ基本的な流れです。

hello_vcl.py
"""DelphiVCLで空のWindowsフォームを表示する最小サンプル。"""

from delphivcl import Application, Form


def main() -> None:
    """VCLの初期化、フォームの表示、終了処理を行う。"""
    Application.Initialize()
    Application.Title = "DelphiVCL Sample"

    form = Form(Application)
    form.Caption = "Hello DelphiVCL"
    form.SetBounds(150, 100, 520, 320)
    form.Show()

    # ウィンドウが閉じられるまでGUIイベントを処理する
    Application.Run()
    form.Destroy()


if __name__ == "__main__":
    main()

実行コマンドは次のとおりです。

.\.venv\Scripts\python.exe .\hello_vcl.py

Application.Initialize()でアプリケーションを初期化し、Form(Application)でウィンドウを作成しています。Application.Run()はWindowsのイベントを処理するメッセージループです。ウィンドウが閉じられると、後続の終了処理に進みます。

公式QuickstartにはFreeConsole()を使う例もありますが、最初の動作確認では付けない方が、標準出力や例外を確認しやすくなります。

4. 公式サンプルとデモを探す

DelphiVCLの良いところは、開発元が公開しているサンプルをそのまま読めることです。まずはGitHubの次のフォルダーを確認してみてください。

公式サンプル一覧:
https://github.com/Embarcadero/DelphiVCL4Python/tree/main/samples

サンプル 内容 ソース
HelloWorld 基本的なフォームの表示 HelloWorld
ActivityIndicator アニメーション、表示サイズ、色、スタイルの変更 ActivityIndicator
ListView 項目を一覧表示するコントロール ListView
TreeView 階層構造の表示やイベント TreeView
DesignExport Delphiのフォーム設計をPython向けに出力する例 DesignExport
Installer PyInstallerを利用する配布方法 Installer

GUIの見た目や、コンポーネントの使い方を知りたい場合は、ActivityIndicator → ListView → TreeViewの順で見るとつかみやすいと思います。

ActivityIndicatorの実行例

公式リポジトリを取得しておけば、次のように実行できます。

# 任意の作業フォルダーで実行
git clone https://github.com/Embarcadero/DelphiVCL4Python.git
cd DelphiVCL4Python

# このリポジトリ内にも仮想環境を作成します
py -3.12 -m venv .venv
.\.venv\Scripts\python.exe -m pip install delphivcl==1.0.7
.\.venv\Scripts\python.exe .\samples\ActivityIndicator\activityindicator.py

ActivityIndicatorのサンプルでは、インジケーターの種類、サイズ、色、アニメーション速度などを切り替える処理が紹介されています。また、VCLスタイルを使った外観変更の参考にもなります。

ブラウザ上で見られる資料

Windows専用のGUIなので、公式の「ブラウザ上で直接操作できるライブデモ」は確認できませんでした。一方、画面イメージや実装例を掲載したサイトはあります。

サイト 主な内容
公式Quickstart 空のフォーム、Hello World、ToDoアプリのコードと画面
Embarcadero公式ブログ GUIの表示例とVCLスタイルの紹介
PythonGUI.org コンポーネント紹介 タブ、入力欄、チェックボックスなどの実装例
Embarcadero動画チュートリアル Windows GUIの作り方を動画で紹介
Delphi4PythonExporter GUIデザイナーを使う方法

公式ドキュメントのExample Galleryは、確認日時点で「under construction(準備中)」と記載されています。現状はGitHubのサンプルやQuickstartが手掛かりになります。

5. サンプル:観測所を登録してCSVに保存する

今度は、もう少し実用的な画面を作ってみます。観測所名を入力して「追加」を押すと一覧に表示され、「CSV保存」を押すとファイルに書き出すアプリです。

この例で使うのは、Form、Label、Edit、Button、ListBox、SaveDialogです。CSVファイルの書き込みにはPython標準ライブラリのcsvを使います。

画面の構成

fig02_station_form_components.png

図2:観測所登録アプリのコンポーネント構成。これは画面部品の関係図であり、実行画面のスクリーンショットではありません。

Pythonコード

次の内容をstation_manager.pyとして保存します。コードが少し長いため、折りたたんでいます。

station_manager.py(ソースコード全体を表示)
station_manager.py
"""DelphiVCLによる観測所登録・CSV保存サンプル。

画面の構成とイベント処理を学ぶための小さなアプリケーションです。
CSVの出力にはPython標準ライブラリを使います。
"""

import csv

from delphivcl import (
    Application,
    Button,
    Edit,
    Form,
    Label,
    ListBox,
    SaveDialog,
)


class StationForm(Form):
    """観測所の入力、一覧表示、CSV保存を受け付けるフォーム。"""

    def __init__(self, owner):
        """GUI部品を作成し、クリックイベントを登録する。"""
        self.Caption = "観測所登録アプリケーション"
        self.SetBounds(150, 100, 560, 420)

        # 画面に表示するデータはPythonのリストでも管理する
        self.station_names: list[str] = []

        # 観測所名の入力
        self.input_label = Label(self)
        self.input_label.SetProps(
            Parent=self, Caption="観測所名を入力してください"
        )
        self.input_label.SetBounds(20, 20, 340, 24)

        self.name_edit = Edit(self)
        self.name_edit.Parent = self
        self.name_edit.SetBounds(20, 55, 330, 28)

        # 追加ボタン
        self.add_button = Button(self)
        self.add_button.SetProps(Parent=self, Caption="追加")
        self.add_button.SetBounds(370, 55, 140, 28)
        self.add_button.OnClick = self.on_add_click

        # 登録された観測所の一覧
        self.station_list = ListBox(self)
        self.station_list.Parent = self
        self.station_list.SetBounds(20, 105, 490, 185)

        # CSVへの保存ボタン
        self.save_button = Button(self)
        self.save_button.SetProps(Parent=self, Caption="CSV保存")
        self.save_button.SetBounds(20, 310, 160, 32)
        self.save_button.OnClick = self.on_save_click

        # 状態表示
        self.status_label = Label(self)
        self.status_label.SetProps(
            Parent=self, Caption="観測所名を入力して追加してください"
        )
        self.status_label.SetBounds(20, 355, 490, 24)

        # Windows標準の保存ダイアログ
        self.save_dialog = SaveDialog(self)
        self.save_dialog.Filter = "CSVファイル (*.csv)|*.csv"
        self.save_dialog.DefaultExt = "csv"
        self.save_dialog.FileName = "stations.csv"

    def on_add_click(self, sender):
        """入力された観測所名を一覧に追加する。"""
        name = self.name_edit.Text.strip()
        if not name:
            self.status_label.Caption = "観測所名が空欄です"
            return

        if name in self.station_names:
            self.status_label.Caption = "同じ観測所名が登録済みです"
            return

        self.station_names.append(name)
        self.station_list.Items.Add(name)
        self.name_edit.Text = ""
        self.status_label.Caption = (
            f"観測所を登録しました({len(self.station_names)}件)"
        )

    def on_save_click(self, sender):
        """保存先を選択し、登録済み観測所をCSVに書き出す。"""
        if not self.station_names:
            self.status_label.Caption = "保存する観測所がありません"
            return

        # キャンセルされたときはファイルを変更しない
        if not self.save_dialog.Execute():
            return

        try:
            # Excelからも日本語を開きやすいUTF-8 BOM付きで保存
            with open(
                self.save_dialog.FileName,
                "w",
                encoding="utf-8-sig",
                newline="",
            ) as file:
                writer = csv.writer(file)
                writer.writerow(["station_name"])
                for name in self.station_names:
                    writer.writerow([name])
        except OSError as exc:
            self.status_label.Caption = f"CSV保存に失敗しました: {exc}"
            return

        self.status_label.Caption = "CSVファイルを保存しました"


def main() -> None:
    """アプリケーションを起動する。"""
    Application.Initialize()
    Application.Title = "観測所登録"

    form = StationForm(Application)
    form.Show()
    Application.Run()
    form.Destroy()


if __name__ == "__main__":
    main()

実行します。

.\.venv\Scripts\python.exe .\station_manager.py

このソースは、公式に公開されているForm、SetBounds、OnClick、ListBox.Items.Add、SaveDialog.ExecuteなどのAPIをもとに記述した例です。Windows実機での動作検証は本稿の作成環境では行っていません。 Pythonの構文は確認していますが、実際のGUI動作はお使いのWindows環境で確かめてください。

イベント処理の考え方

ポイントになるのは次の行です。

self.add_button.OnClick = self.on_add_click

OnClickにPythonのメソッドを設定することで、ボタンを押したときにon_add_click()が呼ばれます。GUIからPythonの処理を呼び出す、最も基本的な仕組みです。

また、フォームや各部品を作る際に出てくるOwnerとParentは別の役割を持ちます。Ownerはコンポーネントの所有や寿命管理に関係し、Parentは画面上でどの部品の内側に表示するかを指定します。

fig03_station_registration_flow.png

図3:入力からCSV出力までの処理。GUIのイベントとファイル操作を分離して考えると、処理を追加しやすくなります。

CSVの保存処理そのものは通常のPythonです。DelphiVCLに特殊なCSV APIが必要なわけではありません。ここではWindows版Excelで日本語を開く場合も考え、utf-8-sigで出力しています。

6. Delphiの画面デザイナーを使う方法

GUIをすべてPythonコードで配置することもできますが、ボタンや入力欄が多くなってくると、座標やサイズの管理が面倒になります。

そのような場合に利用できるのが、Delphi4PythonExporterです。

DelphiやRAD Studioのフォームデザイナーで画面を作り、Pythonで扱える形式に出力できます。現行のExporterのREADMEでは、対応する開発環境に導入したあと、**Tools → Export to Python**から出力する方法が案内されています。

ただし、フォームデザイナーを使う方法では、別途DelphiまたはRAD Studio側の環境が必要です。また、ExporterのバージョンとIDEの対応関係を確認してください。

GUIを学び始めた段階では、最初からフォームデザイナーを使うよりも、Form、Button、Edit、OnClickの関係をコードで理解した方が分かりやすいと思います。

7. PyScripterとの関係

PyScripterもDelphi系の技術を利用しているPython向けIDEですが、DelphiVCLとは役割が違います。

項目 PyScripter DelphiVCL
位置付け Pythonの統合開発環境(IDE) PythonのGUIモジュール
主な用途 編集、実行、デバッグ ウィンドウや部品の作成
使い方 開発ツールとして起動 Pythonからimportする
一緒に使えるか はい はい

公式のActivityIndicatorサンプル説明にも、PyScripterでソースを開いて実行する手順が記載されています。

PyScripterに限らず、VS Codeなどでコードを書いてPowerShellから実行することもできます。DelphiVCLを使うために特定のPython IDEを導入する必要はありません。

8. CSV・DuckDB・WSL2との組み合わせ

実際の業務ツールで考えると、GUIの部分とデータ処理の部分は分けておく方が扱いやすくなります。

例えば、Windows側でDelphiVCLの画面を動かし、CSVやDuckDBの検索をPythonで行う構成です。さらに、大きな処理だけをWSL2 UbuntuやDockerで実行し、結果をWindows側へ返す方法も考えられます。

fig04_windows_wsl2_backend.png

図4:WindowsのGUIとWSL2/Docker上の処理を分担する構成例。DelphiVCLそのものをLinuxで実行する図ではありません。

この構成で重要なのは、DelphiVCLを動かすPythonはWindows側に置くことです。DelphiVCLはWindows向けのネイティブモジュールなので、WSL2のLinux版Pythonにpip installしても同じようには使えません。

大量のデータ処理をボタンのクリックイベント内で同期的に実行すると、画面が応答しなくなる場合があります。重い処理は別プロセスやワーカーに分け、画面の更新はGUIスレッドで行う設計にしておく方が安全です。

9. 作成したアプリをEXEとして配布するには

PythonスクリプトをEXE形式にする候補として、PyInstallerがあります。DelphiVCLの公式サンプルにも、Installerが用意されています。

.\.venv\Scripts\python.exe -m pip install pyinstaller
.\.venv\Scripts\python.exe -m PyInstaller --onedir --name StationManager station_manager.py

ただし、上のコマンドだけで、必ず配布可能なEXEが完成するとは限りません。DelphiVCLにはPython拡張モジュール以外のネイティブファイルも関係するためです。

公式Installerサンプルでは、PyInstallerの.specファイルにDelphiVCLのディレクトリをdatasとして追加する例が示されています。まず--onedir形式で必要ファイルの同梱を確認し、Pythonをインストールしていない別のWindows環境で起動テストするのがよいでしょう。

なお、再配布についてはライセンスの確認も必要です。公式READMEでは、配布用ライブラリはEmbarcadero Freeware License、ソースコードはMIT Licenseと案内されています。EXEやインストーラーを公開する前に条件を確認してください。

10. 他のPython GUIライブラリとの違い

DelphiVCLが常に最適というわけではありません。用途によって適したライブラリは変わります。

ライブラリ 主な対象 特徴
DelphiVCL Windows DelphiのVCLをPythonから使える
DelphiFMX Windows、macOS、Linuxなど FireMonkeyを使う別モジュール
Tkinter Windows、macOS、Linux 標準ライブラリに含まれるGUI
PySide6 Windows、macOS、Linux Qtの豊富なウィジェットや開発機能
wxPython Windows、macOS、Linux 各OSに合わせたGUIコントロール

Windows専用の業務ツールを短期間で作りたいなら、DelphiVCLは検討する価値があります。一方、LinuxやmacOSでも同じGUIを使う予定がある場合は、初めからPySide6などと比較した方がよいでしょう。

11. 試すときにつまずきやすい点

No matching distribution foundと表示される

PythonのバージョンやOS、アーキテクチャが配布wheelと合っていない可能性があります。まずpython --versionと32bit/64bitを確認してください。特に、WSL2上のLinux版Pythonから導入しようとしていないかを確認します。

ウィンドウが表示されない

Application.Initialize()、フォームの作成、Show()、Application.Run()の順序を確認します。エラーを調べている間はFreeConsole()を使わず、PowerShellから実行する方が状況を把握しやすくなります。

GUIが操作できなくなる

イベント処理で長時間の計算やネットワークアクセスを待っていないか確認します。処理を非同期化する場合も、GUI部品をワーカー側から直接書き換えないようにします。

見た目だけでは使い勝手が決まらない

VCL Stylesで見た目を変更することはできますが、文字の大きさ、HiDPI、キーボード操作、表の表示速度なども重要です。特に多件数データを扱う場合は、データベースで絞り込んでから画面に渡す構成にします。

おわりに

DelphiVCLは、PythonからWindowsネイティブのGUIを作れる少し珍しい選択肢です。難しい仕組みを理解する前に、まず公式Quickstartのウィンドウを表示し、ActivityIndicatorやListViewのサンプルを動かしてみるのがよいと思います。

フォーム、入力欄、ボタン、イベント処理の関係が分かれば、CSVの変換ツールやデータベースの検索画面にも応用できます。データ処理をPython側に残せるため、今あるPythonのスクリプトにWindows向けの操作画面を付けたい場合にも使いやすい構成です。

一方で、DelphiVCLはWindows専用です。クロスプラットフォーム対応を考える場合は、この点を最初に判断しておく必要があります。

参考資料

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?