상당히 큰 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 클래스에 있기 때문에 간단합니다. 이 경우 내가 게시 한 코드가 완벽하게 작동합니다.
도움을 주시면 감사하겠습니다. 고맙습니다.
파생 클래스의 changeIntroPanel을 오버라이드합니다. MainPanelOne (gui.panel_one) 클래스를 "MainApp"처럼 정의 할 수 있습니다. –
입력 해 주셔서 감사합니다. 네가 말했듯이 나는 그렇게했다. 내 생각은 두 패널을 만들고 main()에서 window = MainApp (None)을 호출 할 때이 패널을 전달하는 것입니다. 그러나 문제는 p1과 p2가 생성되고 있다는 것입니다. 부모가없는 wxWindowMac을 만들 수 없습니다. 부모가없는 프레임을 만들 수있는 것처럼 보이지만 패널이 아닌 사람은 누구입니까? – intl
이 방법에 대해 : 창 = MainApp (없음) P1 =에 Panel1 (창) P2 = Panel2 (창) window.Show() –