2014-01-16 11 views
0

我有一个任务,将具有很多od数据库交互的多用户框VBA项目迁移到不同的东西 - 因为这必须是不能要求安装软件的东西(所以JRE和.NET都不可用)我相信这可以用Python来完成 - wxPython覆盖了框架和不同的控件(我为它的框架设计器使用了boa构造函数),我还设法通过adodbapi与VBA正在使用的当前数据库连接。我只是想把它放在一起。考虑这个骨架:wxPython中的模块/类之间的交互

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方法中引用应用程序对象?我也有机会发现所有的错误,在这种情况下,我希望听到'正确的方式'的轮廓。 我觉得我可能会错过的可能是适合这些数据库操作的类包装,但即使我做了一个,我仍然希望在我所有的未来框架中只有一个该类的实例,但我可以' t甚至可以通过应用程序实例来实现 - 我在myFrame中导入myApp(本身看起来很奇怪,因为myApp已经导入了myFrame,所以两种方式都可以?),但无论我尝试使用哪种类型的本地变量赋值, “'模块'对象没有属性”...(这让我觉得我可能没有得到如何在Python范围/模块工作)

+1

可以使用wx.GetApp()来获取应用程序 – Yoriz

+0

我尝试,我真的希望这会解决我的问题,但我得到一个错误:'模块'对象没有属性'getApp' - 我DID有导入wx第一件事在框架 – aPinchOfInsomnia

+1

它的国会大厦G,错误显示一个小写G。 wx.GetApp()不是wx.getApp() – Yoriz

回答

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随时随地在你的主框架,因为它被定义为类级别的变量。

您可能也有兴趣在达博项目,这是周围的wxPython的包装是应该使其更容易与数据库的工作:http://www.dabodev.com/

+0

感谢您的强大答复。我去过博客,我也觉得很有帮助,所以也非常感谢。正如Yoriz指出我做错了什么,我会尝试继续我的概念,但会牢记您的版本,以防万一我使用应用程序而不是顶级框架作为数据库操作卡住某个位置主办。此外,我想早些时候使用Dabo,不幸的是,他们没有提到支持Informix,而且我坚持使用特定的数据库引擎。 – aPinchOfInsomnia