wxPython中的模块/类之间的交互



我的任务是将一个具有大量数据库交互的多用户框架VBA项目迁移到不同的东西中,因为这一定是不需要安装软件的东西(所以JRE和.NET是不可能的),我还设法通过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中的作用域/模块是如何工作的)

我写了一些关于这方面的文章,但我使用的是SQLAlchemy。这是我的第一次尝试:

  • http://www.blog.pythonlibrary.org/2011/11/10/wxpython-and-sqlalchemy-an-intro-to-mvc-and-crud/

然后我收到了wxPython社区的朋友和SQLAlchemy的开发人员的一些评论和帮助,并更新了应用程序:

  • http://www.blog.pythonlibrary.org/2011/11/30/improving-medialocker-wxpython-sqlalchemy-and-mvc/

第二篇文章展示了如何创建数据库会话并传递它。我认为这就是你正在寻找的方法。我会在您的顶级框架的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/

相关内容

  • 没有找到相关文章

最新更新