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 パッケージマネージャから行うように書いてあります。
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))は、以下から入手できます。
ソースファイル一式をダウンロードし、以下のプロジェクトを使用してインストール出来ました。
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ファイルを出力します。
出力が成功すると、以下のダイアログが表示されます。
サンプルコード
githubのDelphi4PythonExporter の中にサンプルコードも含まれています。そのサンプルコードを実行してみましょう。
生成されたPythonファイルを実行する為には、VCL and FMX Libraries for Python をPythonにインストールする必要があります。インストール方法は、以下のプログを参照ください。
サンプルコード一覧
Delphi4PythonExporter と、DelphiVCL4Python のサンプルコードで動作確認してみました。
- Delphi4PythonExporter
プロジェクト名 | VCL/FMX |
---|---|
Simple_Demo | FMX |
TipCalculator | FMX |
- DelphiVCL4Python
プロジェクト名 | VCL/FMX |
---|---|
DesignExport\SampleForm | VCL |
DesignExport\ToggleSwitch | VCL |
Simple_Demo
Delphi4PythonExporter のSimple_Demo のフォームを、Pythonファイルに変換してみしょう。
「Export Entire Current Project」メニューで変換
「Export Entire Current Project」メニューで変換すると、以下の5つのファイルが生成されます。
ファイル名 | 説明 |
---|---|
D4P_export_demo.py | メインのPythonファイル |
parent_window.py | parent_windowのPythonファイル |
child_window.py | child_windowのPythonファイル |
parent_window.pyfmx | parent_windowのFormデータ |
child_window.pyfmx | child_windowのFormデータ |
ファイルが作られたフォルダで、DOS窓を開き、以下を実行すると選択したメインフォームが表示されます。
python D4P_export_demo.py
「Export Select Forms」メニューで変換
「Export Select Forms」メニューで変換すると、以下の4つのファイルが生成されます。
ファイル名 | 説明 |
---|---|
parent_window.py | parent_windowのPythonファイル |
child_window.py | child_windowのPythonファイル |
parent_window.pyfmx | parent_windowのFormデータ |
child_window.pyfmx | child_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つのコンポーネントを追加します。
- TPageControlを置き、TabSheetを2つ追加する
- TabSheet1に、TMemoを追加する
- 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も参考にしてみてください。
残念ながらRAD Studio 12 には、まだ対応していないようです。(2023/11/28現在)
Geiit パッケージマネージャにも登録されておらず、ソースファイルからのインストールも正常に行えませんでした。
それから、C++Builder (単体)にもインストール出来ませんでした。ライセンス等が不明ですが、bplからのC++Builder11へのインストールは可能で、C++BuilderのフォームからPthonファイルの出力も出来ました。