データベースとのやり取りが多いマルチユーザーフレームの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 でスコープ/モジュールがどのように機能するかがわからない可能性が高いと思います)