2014-01-16 4 views
0

데이터베이스 상호 작용이 많은 다중 사용자 프레임 워크 VBA 프로젝트를 다른 것으로 마이그레이션하는 작업이 있습니다. 소프트웨어 설치를 요구할 수없는 것이어야합니다 (JRE와 .NET이 있으므로 질문) 나는 이것이 파이썬으로 할 수 있다고 믿는다 - wxPython은 프레임과 다른 컨트롤 (프레임 디자이너를 위해 보아 생성자를 사용한다.)을 다루고, 나는 또한 adodbapi를 통해 VBA가 사용하는 현재 데이터베이스와 연결했다. 나는 그걸 모두 제대로 맞추는 것을 빨아 먹는다.wxPython의 모듈/클래스 간 상호 작용

#!/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.py이 골격을 고려 일하다. 그러나 전체 데이터베이스 연결을 반복해서 복사/붙여 넣기 할 필요가 없기 때문에 모든 것을 한 곳에서 가져와 프레임의 코드에 액세스하려고했습니다. 내 생각으로는 하나의 myApp 객체가 있기 때문에 특히 연결 문자열이 sys.argv [1] 으로 사용 가능하므로 연결 객체를 포함 할 수 있습니다. 가능합니까? 그렇다면 어떻게하면 개체를 OnButton1 메서드 내부에서 참조 할 수 있습니까? 이 모든 것을 잘못 알아 낸 기회가 있습니다.이 경우 올바른 길에 대한 개요를 듣고 싶습니다. 내가 누락되었을 수 있다고 느껴지는 것은 아마도 데이터베이스 작업을위한 적절한 클래스 래퍼 일 것입니다.하지만 하나라도 만들면 모든 미래 프레임에서 해당 클래스의 인스턴스를 하나만 사용하고 싶습니다. - 심지어 myApp를 myFrame 내에서 가져옵니다. myApp는 myApp가 myFrame을 이미 가져온 것처럼 이상하게 보입니다. 두 가지 방법 모두 가능합니까?)하지만 로컬 변수에 대한 할당 유형에 관계없이 대부분 " '모듈'객체에는 속성이 없습니다."... (내게 스코프/모듈이 파이썬에서 작동하는 방법을 모르겠다)

+1

시도, 나는 정말 내 문제를 해결할 것이라고 기대했지만 오류가 발생했습니다 : '모듈'개체에 'getApp'특성이 없습니다 - 그리고 나는 프레임에서 첫 번째 작업을 가져옵니다. – Yoriz

+0

I를 얻을 수 wx.GetApp()를 사용할 수 – aPinchOfInsomnia

+1

해당 국회 의사당 G는 오류가 소문자로 표시됩니다. 지. – Yoriz

답변

0

나는 이것에 대해 조금 썼지 만 SQLAlchemy를 사용하고있었습니다. 이것은 내 첫 번째 시도였다

  • http://www.blog.pythonlibrary.org/2011/11/10/wxpython-and-sqlalchemy-an-intro-to-mvc-and-crud/
    • 그런 다음 나는 wxPython을 커뮤니티에서 친구로부터 약간의 의견과 도움을 받고 SQLAlchemy의의 DEVS 앱을 조금 업데이트 :

      이 두 번째 기사에서는 데이터베이스 세션을 만들고 전달하는 방법을 보여줍니다. 그것. 나는 그것이 당신이 찾고있는 접근법이라고 생각합니다. 그런 다음

      def __init__(self): 
          """Constructor""" 
          wx.Frame.__init__(self, None, title="Databases!") 
      
          self.data_connection = self.create_connection() 
      

      당신이 당신의 다른 프레임을 만들 때, 당신은 그들에게 그 연결을 전달할 수 있습니다 : 당신의 최상위 프레임의 init 메소드에서 데이터베이스 연결을 할 것

      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 전화에도 적용됩니다. 이 같은 그래서 그냥 변경 : 당신은이 클래스 수준 변수로 정의했기 때문에 당신이 당신의 메인 프레임에 어디 self.data_connection에 액세스 할 수 있는지 알 수 있습니다

      def OnButton1(self, event): 
          cursor = self.data_connection.cursor() 
      

      .

      또한 쉽게 데이터베이스 작업을 할 수 있도록되어있다 wxPython에 래퍼 인 다보 프로젝트에 관심이있을 수 있습니다 http://www.dabodev.com/

      당신은 응용 프로그램
    +0

    답장을 보내 주셔서 감사합니다. 나는 블로그에도 갔다. 나는 또한 매우 도움이된다. 그래서 그것에 대해서도 역시 감사한다. Yoriz가 내가 잘못하고있는 것을 지적했듯이, 나는 내 개념을 시도하고 계속 하겠지만, 당신의 버전을 염두에 두겠다. 나는 db operation으로 최상위 프레임 대신에 app을 사용하여 어딘가에 머물게된다. 숙주. 또한 이전에 Dabo를 사용하고 싶었지만 유감스럽게도 Informix를 지원하는 것에 대해서는 언급하지 않았고 특정 데이터베이스 엔진을 사용하고 있습니다. – aPinchOfInsomnia