0

データベースとのやり取りが多いマルチユーザーフレームのVBAプロジェクトを別のものに移行するタスクがあります-これはソフトウェアのインストールを要求できないものでなければならないため(したがって、JREと.NETは問題外です)、これを実行できると思いますPythonを使用-wxPythonはフレームとさまざまなコントロールをカバーします(フレームデザイナーにboa-constructorを使用しています)、adodbapiを介してVBAが使用している現在のデータベースに接続することもできました。私はそれをすべて適切にまとめるのが苦手です。次のスケルトンを検討してください。

myApp.py

#!/usr/bin/env python
#Boa:App:BoaApp

import wx
import myFrame

modules ={u'myFrame': [1, 'Main frame of Application', u'myFrame.py']}

class BoaApp(wx.App):
    def OnInit(self):
        # here I think I'd see something like, say:
        # self.main.cnnObject = adodbapi.connect ( some proper connection string )
        self.main = myFrame.create(None)
        self.main.Show()
        self.SetTopWindow(self.main)
        return True

def main():
    application = BoaApp(0)
    application.MainLoop()

if __name__ == '__main__':
    main()

myFrame.py

#Boa:Frame:myFrame
import wx

def create(parent):
    return myFrame(parent)

[wxID_MYFRAME, wxID_MYFRAMEBUTTON1, 
] = [wx.NewId() for _init_ctrls in range(2)]

class myFrame(wx.Frame):
    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Frame.__init__(self, id=wxID_MYFRAME, name='myFrame', parent=prnt,
              pos=wx.Point(710, 329), size=wx.Size(400, 250),
              style=wx.DEFAULT_FRAME_STYLE, title='MainFrame')
        self.SetClientSize(wx.Size(392, 223))

        self.button1 = wx.Button(id=wxID_MYFRAMEBUTTON1,
              label='FETCH cnnObject', name='button1', parent=self,
              pos=wx.Point(0, 144), size=wx.Size(392, 79), style=0)
        self.button1.Bind(wx.EVT_BUTTON, self.OnButton1,
              id=wxID_MYFRAMEBUTTON1)

    def __init__(self, parent):
        self._init_ctrls(parent)

    def OnButton1(self, event):
        event.Skip()
        # here and in other events in other frames I would like to retrieve 
        # that cnnObject to use for queries

大量のコントロール、イベントを追加し、このフレームから連続したフレームを開き、次に来るように見えます。ただし、データベース接続全体を何度もコピーして貼り付ける必要がないように、すべてを 1 か所にまとめて、フレームからそのコードにアクセスするだけにしたいと考えていました。私の一般的な考えは、myApp オブジェクトが 1 つしかないため、特に接続文字列が sys.argv[1] として使用できるため、接続オブジェクトを含めることができるということです。これは可能ですか? もしそうなら、どのようにアプリケーションを参照しますかOnButton1 メソッド内からのオブジェクト? また、これがすべて間違っているとわかった可能性もあります。その場合、「正しい方法」の概要を聞きたいと思います. 私が欠けているかもしれないと感じているのは、おそらくそれらのデータベース操作のための適切なクラスラッパーですが、作成したとしても、将来のすべてのフレームでそのクラスのインスタンスを 1 つだけ使用したいのですが、できません。アプリケーションインスタンスでそれを行うことさえできます-私はmyFrame内にmyAppをインポートします(myAppはすでにmyFrameをインポートしているため、それ自体は奇妙に思えます。両方の方法ですか?)しかし、ローカル変数への割り当てのタイプに関係なく、私はほとんど " 'module' object has no attribute " ... (これにより、Python でスコープ/モジュールがどのように機能するかがわからない可能性が高いと思います)

4

1 に答える 1