2024/04/24「多機能ファイラーAs/Rの魅力と活用法」を出版、KView32公開

Delphi4Python Exporterの使い方

C++Builder

Delphi4Python Exporterは、RAD Studio(C++Builder/Delphi)からPython用のコードを出力するためのパッケージです。

VCL and FMX Libraries for Python を使用することで、PythonからVCK/FMXのフォームを呼び出すことは可能ですが、少し手間がかかります。Delphi4Python Exporterを使用すると、RAD StudioのプロジェクトからPython用のコードを簡単に出力することができます。

Geiitからのインストール

Delphi4Python Exporterは、githubでも公開されています。

以下のページでは、Delphi4Python Exporterのインストールは、GetIt パッケージマネージャから行うように書いてあります。

GitHub - Embarcadero/Delphi4PythonExporter: Design your Python GUI using Delphi's VCL and FMX designers and then export them for Python use.
Design your Python GUI using Delphi's VCL and FMX designers and then export them for Python use. - GitHub - Embarcadero/...

GetIt パッケージマネージャの選択

RAD Studio11を起動し、メニューの「ツール」→「Geiit パッケージマネージャ」を選択します。

Geiit パッケージマネージャからインストール

「Geiit パッケージマネージャ」の検索入力に、”python”を入力すると「Delphi4Python Exporter 1.2.1」がリスト上に表示されますので、インストールボタンをクリックしてインストールします。

ソースファイルからのインストール

Delphi4Python Exporterですが、筆者の環境(RAD Studio 11.3)ではインストール途中にエラーとなりインストール出来ませんでした。それから、C++Builder 11.3では、「Geiit パッケージマネージャ」に登録されていませんでした。そこで、

現時点での最新のReleases 版(Version v1.2.1 (24 June 2022))は、以下から入手できます。

Releases · Embarcadero/Delphi4PythonExporter
Design your Python GUI using Delphi's VCL and FMX designers and then export them for Python use. - Embarcadero/Delphi4Py...

ソースファイル一式をダウンロードし、以下のプロジェクトを使用してインストール出来ました。

Packages/Delphi11Alexandria/dclDelphi4PythonExperts.dproj

GitHub パッケージマネージャに登録されている Delphi4Python Exporter のソースファイルは、以下のフォルダにインストールされていましたので、このソースファイルを使用しても問題ありません。上記の最新の Releases 版と同じソースファイルでした。

c:\My Documents\Embarcadero\Studio\22.0\CatalogRepository\Delphi4PythonExporter-D11-1.2.1\

Export to Pythonメニュー

インストールが成功すると、メニューの「ツール」に、「Export to Python」メニューが追加されます。

  • Export to Python
    • Export Entire Current Project
    • Export Select Forms

Export Entire Current Project

「Export Entire Current Project」メニューは、プロジェクトを対象として出力します。

  • アプリケーションのTitleの設定
  • メインフォームの選択
  • 出力フォルダの設定
  • pyfmxファイルのフォーマットの選択(Text or Binary)

を行った後、「Export」ボタンをクリックしてPythonファイルを出力します。

出力が成功すると、以下のダイアログが表示されます。

Export Select Forms

「Export Select Forms」メニューは、フォーム毎に、Pythonファイルを出力します。

  • 出力フォルダの設定
  • pyfmxファイルのフォーマットの選択(Text or Binary)

を行った後、「Export」ボタンをクリックしてPythonファイルを出力します。

を行った後、「Export」ボタンをクリックしてPythonファイルを出力します。

出力が成功すると、以下のダイアログが表示されます。

残念ながらRAD Studio 12 には、まだ対応していないようです。(2023/11/28現在)

Geiit パッケージマネージャにも登録されておらず、ソースファイルからのインストールも正常に行えませんでした。

それから、C++Builder (単体)にもインストール出来ませんでした。ライセンス等が不明ですが、bplからのC++Builder11へのインストールは可能で、C++BuilderのフォームからPthonファイルの出力も出来ました。

サンプルコード

githubのDelphi4PythonExporter の中にサンプルコードも含まれています。そのサンプルコードを実行してみましょう。

生成されたPythonファイルを実行する為には、VCL and FMX Libraries for Python をPythonにインストールする必要があります。インストール方法は、以下のプログを参照ください。

C++Builder/Delphi のフォームを Python で使用する
エンバカデロのHPで見つけたPythonツールページには、RAD Studio(C++Builder/Delphi)向けのVCL and FMX Libraries for Pythonが提供されています。これは、VCLやFMXをPythonから利用できる強力なGUIライブラリです。

サンプルコード一覧

Delphi4PythonExporter と、DelphiVCL4Python のサンプルコードで動作確認してみました。

  • Delphi4PythonExporter
プロジェクト名VCL/FMX
Simple_DemoFMX
TipCalculatorFMX
  • DelphiVCL4Python
プロジェクト名VCL/FMX
DesignExport\SampleFormVCL
DesignExport\ToggleSwitchVCL

Simple_Demo

Delphi4PythonExporter のSimple_Demo のフォームを、Pythonファイルに変換してみしょう。

「Export Entire Current Project」メニューで変換

「Export Entire Current Project」メニューで変換すると、以下の5つのファイルが生成されます。

ファイル名説明
D4P_export_demo.pyメインのPythonファイル
parent_window.pyparent_windowのPythonファイル
child_window.pychild_windowのPythonファイル
parent_window.pyfmxparent_windowのFormデータ
child_window.pyfmxchild_windowのFormデータ

ファイルが作られたフォルダで、DOS窓を開き、以下を実行すると選択したメインフォームが表示されます。

python D4P_export_demo.py

「Export Select Forms」メニューで変換

「Export Select Forms」メニューで変換すると、以下の4つのファイルが生成されます。

ファイル名説明
parent_window.pyparent_windowのPythonファイル
child_window.pychild_windowのPythonファイル
parent_window.pyfmxparent_windowのFormデータ
child_window.pyfmxchild_windowのFormデータ

ファイルが作られたフォルダで、DOS窓を開き、以下を実行するとそれぞれのフォームが表示されます。

python parent_window.py

python child_window.py

TipCalculator

Delphi4PythonExporter のTipCalculator も、Simple_Demoと同様にPythonファイルに変換する事が出来ます。TipCalculator は、Styleが設定されており、見た目を変更する事が出来ます。

デフォルトのStyleは、オブジェクトインスペクタの「StyleBook」で選択します。

・stylGoldeを選択すると、見た目が以下の様に変わります。

Modified_TipMainフォルダ

サンプルのModified_TipMainフォルダには、

  • ボタンのイベント処理(Styleの変更)
  • SpinBoxのイベント処理
  • TracckBarのイベント処理

等が追加されたサンプルコードがありました。

import os
from delphifmx import *

class Main_Window(Form):

    def __init__(self, owner):
        self.styleRuby = None
        self.styleLight = None
        self.ListBox1 = None
        self.ListBoxItem1 = None
        self.editTotal = None
        self.Label6 = None
        self.ListBoxItem2 = None
        self.Label7 = None
        self.editTip = None
        self.ListBoxItem3 = None
        self.trackTip = None
        self.ListBoxItem4 = None
        self.editPeople = None
        self.Label3 = None
        self.ListBoxItem5 = None
        self.trackPeople = None
        self.ListBoxItem6 = None
        self.Layout2 = None
        self.ListBoxItem7 = None
        self.per_person_share = None
        self.Label1 = None
        self.ListBoxItem8 = None
        self.bill_plus_tip = None
        self.Label5 = None
        self.ListBoxItem9 = None
        self.gold_style_btn = None
        self.ruby_style_btn = None
        self.light_style_btn = None
        self.default_style = None
        self.styleGold = None
        self.LoadProps(os.path.join(os.path.dirname(os.path.abspath(__file__)), "TipMain.pyfmx"))
# 以下が追加/修正されています。
        self.editTotal.OnChange = self.editTotalChange
        self.editTotal.Value = 100
        self.editTip.Value = 20
        self.editPeople.Value = 4

    def calc_bill_plus_tip(self):
        total = self.editTotal.Value
        tip_percent = self.editTip.Value

        if total != 0:
            self.bill_plus_tip.Text = str(round(total + (tip_percent*total)/100, 2))
            print(round(total + (tip_percent/total)*100, 2))
        else:
            self.bill_plus_tip.Text = str(0)

    def calc_per_person_share(self):
        persons = self.editPeople.Value

        self.per_person_share.Text = str(round(float(self.bill_plus_tip.Text) / persons, 2))

    def editTotalChange(self, Sender):
        self.calc_bill_plus_tip()
        self.calc_per_person_share()

    def editTipChange(self, Sender):
        self.trackTip.Value = self.editTip.Value
        self.calc_bill_plus_tip()
        self.calc_per_person_share()

    def trackTipChange(self, Sender):
        self.editTip.Value = self.trackTip.Value
        self.calc_bill_plus_tip()
        self.calc_per_person_share()

    def editPeopleChange(self, Sender):
        self.trackPeople.Value = self.editPeople.Value
        self.calc_bill_plus_tip()
        self.calc_per_person_share()

    def trackPeopleChange(self, Sender):
        self.editPeople.Value = self.trackPeople.Value
        self.calc_bill_plus_tip()
        self.calc_per_person_share()

# ボタンイベント処理で、Styleを変更しています。
    def gold_style_btnClick(self, Sender):
        self.styleBook = self.styleGold

    def ruby_style_btnClick(self, Sender):
        self.styleBook = self.styleRuby

    def light_style_btnClick(self, Sender):
        self.styleBook = self.styleLight

    def default_styleClick(self, Sender):
        self.styleBook = None
  • 以下は、Styleを変更したフォームです。

DesignExport\SampleForm

以下は、SampleFormのプロジェクトです。

「Export Select Forms」メニューで変換すると、

  • uMainForm.py
  • uMainForm.pydfm

が、生成されます。uMainForm.py を Pythonで実行すると、以下のようなエラーが発生しました。

D:\work3\Python\DelphiVCL4Python\DesignExport\SampleForm\Python>python uMainForm.py
Traceback (most recent call last):
  File "D:\work3\Python\DelphiVCL4Python\DesignExport\SampleForm\Python\uMainForm.py", line 43, in <module>
    main()
  File "D:\work3\Python\DelphiVCL4Python\DesignExport\SampleForm\Python\uMainForm.py", line 37, in main
    MainForm = MainForm(Application)
               ^^^^^^^^
UnboundLocalError: cannot access local variable 'MainForm' where it is not associated with a value

サンプルコード内にある、MainForm.py と比較すると

uMainForm.py の以下の箇所が、

    MainForm = MainForm(Application)
    MainForm.Show()
    FreeConsole()
    Application.Run()

MainForm.py では、以下のようになっていました。

    Main = MainForm(Application)
    Main.Show()
    FreeConsole()
    Application.Run()
    Main.Destroy()

uMainForm.py を MainForm.py と同じコードに書き替えればエラーなく、フォームが表示されました。

これは、 MainFormクラスと同じ名前の変数名(MainForm)を使用している為のエラーのようです。

変数名(MainForm)を変更しても、エラーなくフォームが表示出来ました。

DesignExport\ToggleSwitch

「Export Select Forms」メニューで変換すると、

  • uMain.py
  • uMain.pydfm

が、生成されます。uMain.py を Pythonで実行すると、フォームが表示されます。

C++Builderのフォームの変換

Delphi4Python Exporter ですが、Delphi だけでなく、C++Builderにも対応していました。

C++BuilderのフォームをPythonファイルに変換してみます。

SDIアプリケーションのプロジェクトの作成

アプリケーションを作成するときの雛形として良く使用する、SDIアプリケーションをを例に説明します。

メニューの「ファイル」→「新規作成」→「その他」で、「新規作成」ダイアログを表示させます。

そのダイアログで、「C++Buildreプロジェクト」→「Windows」で、「SDIアプリケーション」を選択して「OK」ボタンをクリックして、適当なフォルダにプロジェクトを保存します。

SDIアプリケーションのプロジェクトを開く

プロジェクトを開くと、「SDIアプリケーション」の雛形のフォームが表示されます。

プロジェクトの修正

SDIアプリケーション」の雛形に以下の3つのコンポーネントを追加します。

  1. TPageControlを置き、TabSheetを2つ追加する
  2. TabSheet1に、TMemoを追加する
  3. TabSheet2に、TPanelを追加する

Export Select Formsの実行

Export Select Formsm メニューを実行すると、

  • SDIMAIN.py
  • ABOUT.py
  • SDIMAIN.pydfm
  • ABOUT.pydfm

の4つのファイルが生成されます。

python ABOUT.py

を実行すると、aboutダイアログが表示されます。

python SDIMAIN.py

を実行すると、以下のようなエラーが出ました。

エラー内容を確認すると、TEditCut クラスがないというエラーでした。DelphiVCL4Python は、このクラスには未対応のようです。

D:\work3\Python\test1\Python>python SDIMAIN.py
Traceback (most recent call last):
  File "D:\work3\Python\test1\Python\SDIMAIN.py", line 74, in <module>
    main()
  File "D:\work3\Python\test1\Python\SDIMAIN.py", line 68, in main
    MainForm = SDIAppForm(Application)
               ^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\work3\Python\test1\Python\SDIMAIN.py", line 48, in __init__
    self.LoadProps(os.path.join(os.path.dirname(os.path.abspath(__file__)), "SDIMAIN.pydfm"))
RuntimeError: Class TEditCut not found

そこで、SDIMAIN.pydfm 内の以下の部分を削除しました。

    object EditCut1: TEditCut
      Category = #32232#38598
      Caption = #20999#12426#21462#12426'(&T)'
      Hint = #20999#12426#21462#12426'|'#36984#25246#37096#20998#12434#20999#12426#21462#12426#65292#12463#12522#12483#12503#12508#12540#12489#12395#36865#12427
      ImageIndex = 0
      ShortCut = 16472
    end
    object EditCopy1: TEditCopy
      Category = #32232#38598
      Caption = #12467#12500#12540'(&C)'
      Hint = #12467#12500#12540'|'#36984#25246#31684#22258#12434#12463#12522#12483#12503#12508#12540#12489#12395#12467#12500#12540
      ImageIndex = 1
      ShortCut = 16451
    end
    object EditPaste1: TEditPaste
      Category = #32232#38598
      Caption = #36028#12426#20184#12369'(&P)'
      Hint = #36028#12426#20184#12369'|'#12463#12522#12483#12503#12508#12540#12489#12398#20869#23481#12434#36028#12426#20184#12369#12427
      ImageIndex = 2
      ShortCut = 16470
    end

再度、python SDIMAIN.py を実行したところ、フォームを表示することが出来ました。

このように、VCL/FMXの全ての機能に対応はしていないようですが、基本的なコントロールは使用できますので、Python用の画面を作るのには便利ではないでしょうか。

以下のプログ&HPも参考にしてみてください。

タイトルとURLをコピーしました