実現したいこと
訳あってVBAで作成した業務システムをPythonに移行する必要に迫られています。
フォーム上のボタンなどのコントロールをクリックする等によって、同一フォーム上の別のコントロールの挙動を操作する、といった処理です。
ロジックは、次ような流れです。
- コントロールを動的に追加(ボタン、テキストボックス、ラベル、チェックボックス等)
- 生成したコントロールをラッパークラスのインスタンスに紐づけ
- 2のインスタンスをDictionaryオブジェクトに代入。Keyは自動生成されたNameプロパティを使用。
操作させたい関連コントロールのインスタンス名も、オリジナルプロパティ(RelationCtrl:コレクション)に保存。
4. 必要な時、Keyを基にして都度Dictionaryオブジェクトから取り出し、関連コントロールのインスタンスを操作する。
上記のような処理をPython(Tkinter)で書くにはどのようにすればよいのか、ご経験のある方、ご教示頂ければ幸いです。
該当のソースコード
非常に長くなるので、要点のみ抜粋します。細かい部分は端折っているので、ロジックのみご覧頂ければ幸いです。変数名も、分かりやすいように適当に変えてあります。
VBA
1'クラスモジュール - CommandButtonWrapper 2Private WithEvents InnerCommandButton As MSForms.CommandButton 3'---以下略 4Public Sub SetControl(CommandButton_New As MSForms.CommandButton) 5 Set InnerCommandButton = CommandButton_New 6'---中略 7end sub 8'以下略 コマンドボタンの他、ラベル、テキストボックスなど他コントロールも同様にクラス化して、オリジナルのメソッド・プロパティを大量に追加 9'クリックイベントなども、クラスに記述 10Private Sub InnerCommandButton_Click() 11 Call UserForm1.CommandButton_CLICK(Me) 12End Sub 13 14'ユーザーフォーム 15Private CtrlDic As Object 16'---中略 17Private Sub ControlInitialize() 18Dim Ctrl As Control 19Dim MyButton As CommandButtonWrapper 20 CtrlDic = = CreateObject("Scripting.Dictionary") 21 Set Ctrl = UserForm1.Controls.Add(TypeControl("Forms.CommandButton.1")) 22 Set MyButton = New CommandButtonWrapper 23 '独自メソッド SetControl で紐づけ 24 MyButton.SetControl Ctrl 25 '自動生成されたKeyで、インスタンスを辞書に代入 26 CtrlDic.Add Ctrl.Name, MyButton 27'---中略 各種プロパティに代入 28 Set MyButton = Nothing 29'---以下略 30End Sub 31'関連する他のコントロールを操作するとき For each やオリジナルのRelationCtrlプロパティでKeyを取得し、当該インスタンスを取得する 32'Keyが格納されているRelationCtrlプロパティを使う例 33Public Sub CommandButton_CLICK(MyCtrl As CommandButtonWrapper) 34'クリックイベントを受け取るプロシージャ 35'---中略 36 CtrlDic(MyButton.RelationCtrl(1)).Enabled = True 37'---以下略 38End Sub 39 40'For Eachで操作する例 ※CtrlTypeはオリジナルのプロパティ 41Dim DicKey as Variant 42Const TITLELABEL as Integer = 1 43 44 For Each DicKey In CtrlDic 45 If CtrlDic(DicKey).CtrlType = TITLELABEL Then 46 CtrlDic(DicKey).Visible = True 47 End If 48 Next
どうぞよろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。