【问题标题】:interacting between modules / classes in wxPythonwxPython中模块/类之间的交互
【发布时间】:2014-01-16 15:51:55
【问题描述】:

我的任务是将具有大量 od 数据库交互的多用户框架 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 方法中引用 application 对象?我也有可能把这一切弄错了,在这种情况下,我想听听“正确方式”的概述。 我觉得我可能缺少的可能是这些数据库操作的适当类包装器,但即使我制作了一个,我仍然希望在我未来的所有框架中只有一个该类的实例可用,但我不能甚至设法用应用程序实例来做到这一点 - 我在 myFrame 中导入 myApp(这本身看起来很奇怪,因为 myApp 已经导入了 myFrame,所以两种方式都可以?)但无论我尝试对局部变量进行何种类型的赋值,我大多得到一个“ 'module' 对象没有属性“...(这让我觉得我可能不明白 Python 中的作用域/模块是如何工作的)

【问题讨论】:

  • 您可以使用 wx.GetApp() 来获取应用程序
  • 我试过了,我真的希望这能解决我的问题,但我得到了一个错误:'module' object has no attribute 'getApp' - 我确实在框架中有 import wx 的第一件事跨度>
  • 它是大写字母 G,错误显示小写字母 g。 wx.GetApp() 不是 wx.getApp()
  • 哇,谢谢,看来我真的看不出我的错误,所有的 getter/setter 都是以小写开头的不同语言

标签: python wxpython adodbapi boa-constructor


【解决方案1】:

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

然后我从 wxPython 社区的朋友和 SQLAlchemy 的开发人员那里得到了一些 cmets 和帮助,并稍微更新了应用程序:

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

【讨论】:

  • 感谢您的有力回复。我去过博客,我觉得它也很有帮助,所以也谢谢你。正如 Yoriz 指出我做错了什么,我会尝试继续我的概念,但会记住你的版本,以防我在使用应用程序而不是顶级框架作为数据库操作时卡在某个地方主持人。另外,我想早点使用 Dabo,不幸的是他们没有提到支持 Informix,我被那个特定的数据库引擎卡住了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
相关资源
最近更新 更多