2014-02-20 2 views
2

Я работаю над довольно большим графическим интерфейсом и, таким образом, использую wxpython для его создания. У меня есть один кадр, несколько кадров со своими собственными функциями и основной файл, который импортирует компоненты gui, а также другие внешние функции. Я решил сохранить код gui/wxpython другим, чтобы лучше модулировать код.wxpython - один кадр, несколько панелей, модульный код

Главный вопрос, который у меня есть, заключается в том, как выполнять функции в отдельных панелях и как заставить их работать из моего основного файла python.

Ниже приведен пример моего кода WxPython:

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 

Так что те мои компоненты графического интерфейса. Затем, в моем главном файле, я импортировать его и запустить графический интерфейс:

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() 

Как вы можете сказать, идея заключается в том, что я хочу сделать всю свою реализацию в моем главном файле. Как бы я хотел определить функциональность моей функции changeIntroPanel, которая была впервые определена в panel_one? На данный момент идея состоит в том, чтобы скрыть panelOne и показать панель Two.

Я уже делал что-то подобное раньше, но только с одним фреймом. В этом случае это было тривиально, так как все функции находятся в классе MainFrame для начала. В этом случае код, который я опубликовал, будет работать отлично.

Любая помощь приветствуется. Спасибо.

+0

переопределить changeIntroPanel в производном классе. Вы можете определить класс MainPanelOne (gui.panel_one), как и ваш «MainApp». –

+0

Благодарим вас за ввод. Я так и сделал, как вы сказали. Моя идея состоит в том, чтобы создать две панели и передать их, когда я вызываю window = MainApp (None) в main(). Проблема в том, что p1 и p2 создаются, я получаю следующее исключение: не могу создать wxWindowMac без родителя. Видя, как я могу создать рамку без родителя, кто не панели? – intl

+1

Как об этом: окно = MainApp (None) p1 = Panel1 (окно) p2 = panel2 (окно) window.Show() –

ответ

6

def OnInit(self, parent): используется вместо wx.App, вместо этого вам необходимо def _ _init_ _(self, parent).

О __init__ пожалуйста, проверьте: Using inheritance in python

О разнице между __init__ и OnInit пожалуйста, проверьте this link

Edit:

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

Спасибо. Это добавляет панели к кадру (хотя я немного запутался в __init__, в отличие от OnInit). Однако def changeIntroPanel все еще не работает.Проблема в том, что он должен ссылаться на класс MainFrame, но он не может. – intl

+0

Обновление: я могу обойти проблему, связав эту функцию в моем MainAPP __init__, а затем просто введя def changeIntroPanel в сам MainApp. Это единственный способ или есть лучший способ сохранить функцию в Panel1 и работать с этим? – intl

+1

@intl вид понимания вашей цели, пожалуйста, проверьте ответ на обновление. –

Смежные вопросы