2014-02-20 5 views
2

상당히 큰 GUI 프로젝트에서 작업 중이므로 wxpython을 사용하여 빌드하고 있습니다. 하나의 프레임과 여러 프레임이 고유 한 기능을 가지며 GUI 파일과 다른 외부 기능을 가져 오는 기본 파일이 있습니다. 코드를 더 잘 모듈화하기 위해 gui/wxpython 코드를 다른 것으로 유지하기로 결정했습니다.wxpython - 하나의 프레임, 다중 패널, 모듈화 코드

내가 가지고있는 주된 질문은 별도의 패널에서 함수를 실행하는 방법과이를 주요 파이썬 파일에서 작동시키는 것입니다. 그래서 사람들은 내 GUI 구성 요소입니다

import wx 

class MainFrame (wx.Frame): 

    def __init__(self, parent): 
     wx.Frame.__init__ (self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size(800,600), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL) 

     self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize) 

     bSizer1 = wx.BoxSizer(wx.VERTICAL) 

     self.SetSizer(bSizer1) 
     self.Layout() 

     self.panelOne = panel_one(self) 
     self.panelTwo = panel_two(self) 

     self.panelTwo.Hide() 


     self.Centre(wx.BOTH) 

    def __del__(self): 
     pass 


class panel_one (wx.Panel): 

    def __init__(self, parent): 
     wx.Panel.__init__ (self, parent, id = wx.ID_ANY, pos = wx.DefaultPosition, size = wx.Size(800,600), style = wx.TAB_TRAVERSAL) 

     bSizer5 = wx.BoxSizer(wx.VERTICAL) 

     self.m_button2 = wx.Button(self, wx.ID_ANY, u"MyButton", wx.DefaultPosition, wx.DefaultSize, 0) 
     bSizer5.Add(self.m_button2, 0, wx.ALL, 5) 

     self.SetSizer(bSizer5) 
     self.Layout() 

     # Connect Events 
     self.m_button2.Bind(wx.EVT_BUTTON, self.changeIntroPanel) 

    def __del__(self): 
     pass 


    # Virtual event handlers, overide them in your derived class 
    def changeIntroPanel(self, event): 
     event.Skip() 



class panel_two (wx.Panel): 


    def __init__(self, parent): 
     wx.Panel.__init__ (self, parent, id = wx.ID_ANY, pos = wx.DefaultPosition, size = wx.Size(800,600), style = wx.TAB_TRAVERSAL) 

    ... some code in here ... 

    def __del__(self): 
    pass 

: 아래

내 wxPython에 코드의 샘플입니다. 그런 다음 내 주요 파일에, 나는 그것을 가져 GUI를 실행 : 당신이 말할 수있는 아이디어가 내 주요 파일에있는 모든 내 구현을 수행 할 것입니다

import gui 

class MainApp(gui.MainFrame): 
    def __init__(self, parent): 
     gui.MainFrame.__init__(self, parent) 

     self.panelOne = Panel1(self) 
     self.panelTwo = Panel2(self) 
     self.panelTwo.Hide() 

class Panel1(gui.panel_one): 
    def __init__(self, parent): 
     gui.panel_one.__init__(self, parent) 

    def changeIntroPanel(self, event): 
      if self.panelOne.IsShown(): 
       self.SetTitle("Panel Two Showing") 
       self.PanelOne.Hide() 
       self.PanelTwo.Show() 
      else: 
       self.SetTitle("Panel One Showing") 
       self.PanelOne.Show() 
       self.PanelTwo.Hide() 
      self.Layout() 


class Panel2(gui.panel_two): 
    def __init__(self, parent): 
     gui.panel_two.__init__(self, parent) 

def main(): 
    app = wx.App() 
    window = MainApp(None) 
    window.Show(True) 
    app.MainLoop() 

if __name__ == '__main__': 
    main() 

합니다. Panel_one에서 처음 정의 된 changeIntroPanel 함수의 기능을 정의하는 방법은 무엇입니까? 지금은 panelOne을 숨기고 panelTwo를 표시하는 것이 좋습니다.

나는 이전과 비슷한 것을했지만 한 프레임 만 사용했습니다. 이 경우, 모든 함수가 MainFrame 클래스에 있기 때문에 간단합니다. 이 경우 내가 게시 한 코드가 완벽하게 작동합니다.

도움을 주시면 감사하겠습니다. 고맙습니다.

+0

파생 클래스의 changeIntroPanel을 오버라이드합니다. MainPanelOne (gui.panel_one) 클래스를 "MainApp"처럼 정의 할 수 있습니다. –

+0

입력 해 주셔서 감사합니다. 네가 말했듯이 나는 그렇게했다. 내 생각은 두 패널을 만들고 main()에서 window = MainApp (None)을 호출 할 때이 패널을 전달하는 것입니다. 그러나 문제는 p1과 p2가 생성되고 있다는 것입니다. 부모가없는 wxWindowMac을 만들 수 없습니다. 부모가없는 프레임을 만들 수있는 것처럼 보이지만 패널이 아닌 사람은 누구입니까? – intl

+1

이 방법에 대해 : 창 = MainApp (없음) P1 =에 Panel1 (창) P2 = Panel2 (창) window.Show() –

답변

6

def OnInit(self, parent):이 wx.App에 사용되면 def _ _init_ _(self, parent)이 필요합니다.

는 약 __init__ 확인하십시오 : __init__OnInit의 차이에 대해 Using inheritance in python

확인하시기 바랍니다 this link

편집 :

gui.py

import wx 

class MainFrame (wx.Frame): 
    def __init__(self, parent): 
     wx.Frame.__init__ (self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size(800,600), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL) 
     self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize) 
     bSizer1 = wx.BoxSizer(wx.VERTICAL) 
     self.SetSizer(bSizer1) 
     self.Layout() 

     # self.panelOne = panel_one(self) 
     # self.panelTwo = panel_two(self) 
     # self.panelTwo.Hide() 
     self.Centre(wx.BOTH) 
    def __del__(self): 
     pass 

class panel_one (wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__ (self, parent, id = wx.ID_ANY, pos = wx.DefaultPosition, size = wx.Size(800,600), style = wx.TAB_TRAVERSAL) 
     bSizer5 = wx.BoxSizer(wx.VERTICAL) 
     self.m_button2 = wx.Button(self, wx.ID_ANY, u"panel 1 button", wx.DefaultPosition, wx.DefaultSize, 0) 
     bSizer5.Add(self.m_button2, 0, wx.ALL, 5) 
     self.SetSizer(bSizer5) 
     self.Layout() 
     # Connect Events 
     self.m_button2.Bind(wx.EVT_BUTTON, self.changeIntroPanel) 
    def __del__(self): 
     pass 
    # Virtual event handlers, overide them in your derived class 
    def changeIntroPanel(self, event): 
     event.Skip() 

class panel_two (wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__ (self, parent, id = wx.ID_ANY, pos = wx.DefaultPosition, size = wx.Size(800,600), style = wx.TAB_TRAVERSAL) 
     bSizer5 = wx.BoxSizer(wx.VERTICAL) 
     self.m_button2 = wx.Button(self, wx.ID_ANY, u"panel 2 button ", wx.DefaultPosition, wx.DefaultSize, 0) 
     bSizer5.Add(self.m_button2, 0, wx.ALL, 5) 
     self.SetSizer(bSizer5) 
     self.Layout() 
     # Connect Events 
     self.m_button2.Bind(wx.EVT_BUTTON, self.changeIntroPanel) 

    def __del__(self): 
     pass 
     # Virtual event handlers, overide them in your derived class 
    def changeIntroPanel(self, event): 
     event.Skip() 

mainapp.py

,
import wx 
import gui 

class MainApp(gui.MainFrame): 
    def __init__(self, parent): 
     gui.MainFrame.__init__(self, parent) 

     self.panelOne = Panel1(self) 
     self.panelTwo = Panel2(self) 
     self.panelTwo.Hide() 

class Panel1(gui.panel_one): 
    def __init__(self, parent): 
     gui.panel_one.__init__(self, parent) 
     self.parent = parent 

    def changeIntroPanel(self, event): 
     if self.IsShown(): 
      self.parent.SetTitle("Panel Two Showing") 
      self.Hide() 
      self.parent.panelTwo.Show() 


class Panel2(gui.panel_two): 
    def __init__(self, parent): 
     gui.panel_two.__init__(self, parent) 
     self.parent = parent 

    def changeIntroPanel(self, event): 
     if self.IsShown(): 
      self.parent.SetTitle("Panel One Showing") 
      self.parent.panelOne.Show() 
      self.Hide() 

def main(): 
    app = wx.App() 
    window = MainApp(None) 
    window.Show(True) 
    app.MainLoop() 

if __name__ == '__main__': 
    main() 
+0

감사합니다. 이렇게하면 패널이 프레임에 추가됩니다 (OnInit과는 반대로 __init__에 대해서는 약간 혼란 스럽지만). 그러나 def changeIntroPanel은 여전히 ​​작동하지 않습니다.MainFrame 클래스를 참조해야하지만 문제는 아닙니다. – intl

+0

업데이트 : 내 MainAPP __init__에서 함수를 바인딩 한 다음 def changeIntroPanel을 MainApp 자체로 가져 와서 문제를 우회 할 수 있습니다. 이것이 유일한 방법입니까, 아니면 Panel1의 기능을 유지하고 그 기능을 사용하는 더 좋은 방법입니까? – intl

+1

@intl 종류의 목적을 이해하고 있으면 업데이트 답변을 확인하십시오. –