我的任务是将具有大量数据库交互的多用户帧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
添加大量的控件,事件,从这个和下一个打开连续的帧似乎工作。但是,为了不必一遍又一遍地复制/粘贴整个数据库连接的东西,我想在一个地方拥有它,只是从帧中访问该代码。 我的一般想法是,因为只有一个myApp对象,它可以包含连接对象,特别是因为连接字符串可用作sys.argv [1] 这可能吗 ?如果是这样,我将如何从OnButton1方法中引用应用程序对象?我也有机会弄清楚所有错误,在这种情况下,我想听听“正确方法”的大纲。 我觉得我可能缺少的可能是这些数据库操作的正确类包装器,但即使我制作一个,我仍然希望在我未来的所有帧中只有一个该类的实例可用,但我不能甚至设法用应用程序实例做到这一点 - 我在myFrame中导入myApp(这本身看起来很奇怪,因为myApp已经导入了myFrame,所以两种方式?)但无论我尝试使用哪种类型的本地变量赋值,我都会得到一个“ 'module'对象没有属性“...(这让我觉得我可能没有得到Python中的作用域/模块如何工作)
答案 0 :(得分:0)
我写了一些关于此的内容,但我使用的是SQLAlchemy。这是我的第一次尝试:
然后我收到了来自wxPython社区的朋友和SQLAlchemy的开发人员的一些评论和帮助,并稍微更新了应用程序:
第二篇文章介绍了如何创建数据库会话并将其传递给它。我认为这是你正在寻找的方法。我会在顶级框架的init方法中进行数据库连接:
def __init__(self):
"""Constructor"""
wx.Frame.__init__(self, None, title="Databases!")
self.data_connection = self.create_connection()
然后,当您创建其他框架时,您可以将该连接传递给它们:
def create_new_frame(self):
""""""
new_frame = MyOtherFrame(self.data_connection)
new_frame.Show()
以下是设置框架类的一种方法:
########################################################################
class MyOtherFrame(wx.Frame):
""""""
#----------------------------------------------------------------------
def __init__(self, data_connection):
"""Constructor"""
wx.Frame.__init__(self, None, title="Other frame")
self.data_connection = data_connection
只需确保您不关闭其他框架中的数据连接,因为它也会在原始顶级框架中关闭它。
此解决方案也适用于您的 OnButton1 电话。只需改变它就像这样:
def OnButton1(self, event):
cursor = self.data_connection.cursor()
您会注意到您可以在主框架的任何位置访问 self.data_connection ,因为它被定义为类级变量。
您可能也对Dabo项目感兴趣,该项目是wxPython的一个包装器,它可以更容易地使用数据库:http://www.dabodev.com/