2012-01-10 3 views
1
import wx 
import wx.grid as gridlib 

######################################################################## 
class PanelOne(wx.Panel): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self, parent): 
     """Constructor""" 
     wx.Panel.__init__(self, parent=parent) 
     txt = wx.TextCtrl(self) 
     button =wx.Button(self, label="Save", pos=(200, 325)) 
     button.Bind(wx.EVT_BUTTON, self.onSwitchPanels) 

######################################################################## 
class PanelTwo(wx.Panel): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self, parent): 
     """Constructor""" 
     wx.Panel.__init__(self, parent=parent) 

     grid = gridlib.Grid(self) 
     grid.CreateGrid(25,12) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(grid, 0, wx.EXPAND) 
     self.SetSizer(sizer) 

######################################################################## 
class MyForm(wx.Frame): 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     wx.Frame.__init__(self, None, wx.ID_ANY, 
          "Panel Switcher Tutorial") 

     self.panel_one = PanelOne(self) 
     self.panel_two = PanelTwo(self) 
     self.panel_two.Hide() 

     self.sizer = wx.BoxSizer(wx.VERTICAL) 
     self.sizer.Add(self.panel_one, 1, wx.EXPAND) 
     self.sizer.Add(self.panel_two, 1, wx.EXPAND) 
     self.SetSizer(self.sizer) 

     menubar = wx.MenuBar() 
     fileMenu = wx.Menu() 
     switch_panels_menu_item = fileMenu.Append(wx.ID_ANY, 
                "Switch Panels", 
                "Some text") 
     self.Bind(wx.EVT_MENU, self.onSwitchPanels, 
        switch_panels_menu_item) 
     menubar.Append(fileMenu, '&File') 
     self.SetMenuBar(menubar) 

    #---------------------------------------------------------------------- 
    def onSwitchPanels(self, event): 

     if self.panel_one.IsShown():  
      self.SetTitle("Panel Two Showing") 
      self.panel_one.Hide 
      self.panel_two.Show() 
     else: 
      self.SetTitle("Panel One Showing") 
      self.panel_one.Show() 
      self.panel_two.Hide() 
      self.Layout() 


# Run the program 
if __name__ == "__main__": 
    app = wx.App(False) 
    frame = MyForm() 
    frame.Show() 
    app.MainLoop() 

PanelOne 클래스의 버튼을 클릭하면 function onSwitchPanels를 호출하려고합니다.이 애플리케이션은 this code in Tkinter처럼 작동하고 싶습니다.버튼 wxpython으로 패널 변경

저는 스택 맨이 있습니다. 도와 줘서 고마워요.

답변

7

1 년 전에이 주제에 대한 자습서를 작성했지만 메뉴를 사용하여 전환 작업을 수행했습니다. 코드를 조정하여 버튼을 만들 수 있습니다. 이 자습서는 다음과 같습니다. http://www.blog.pythonlibrary.org/2010/06/16/wxpython-how-to-switch-between-panels/

편집 : 위 코드의 문제점은 세 가지입니다. 먼저 onSwitchPanels 메소드에서 "self.panel_one.Hide()"가 필요합니다. 코드에없는 괄호에 유의하십시오. 둘째, "self.Layout()"을 들여 쓰지 않은 상태로 만들 필요가 있으므로 "else"부분이 아닌 if 문과 같은 수준입니다. 마지막으로 PanelOne에서 "onSwitchPanels"를 호출 할 수 없으므로 PanelOne에서 호출 할 수 없습니다. 그래도 이렇게 변경할 수 있습니다.

button.Bind(wx.EVT_BUTTON, parent.onSwitchPanels) 

추악하고 권장하지는 않지만 작동합니다. 대신 PubSub을 사용해야합니다.

편집 # 2 : OP가 내 제안을 시도조차하지 않을 것이므로 코드를 게시해야합니다.

import wx 
import wx.grid as gridlib 

######################################################################## 
class PanelOne(wx.Panel): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self, parent): 
     """Constructor""" 
     wx.Panel.__init__(self, parent=parent) 
     txt = wx.TextCtrl(self) 
     button =wx.Button(self, label="Save", pos=(200, 325)) 
     button.Bind(wx.EVT_BUTTON, parent.onSwitchPanels) 

######################################################################## 
class PanelTwo(wx.Panel): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self, parent): 
     """Constructor""" 
     wx.Panel.__init__(self, parent=parent) 

     grid = gridlib.Grid(self) 
     grid.CreateGrid(25,12) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(grid, 0, wx.EXPAND) 
     self.SetSizer(sizer) 

######################################################################## 
class MyForm(wx.Frame): 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     wx.Frame.__init__(self, None, wx.ID_ANY, 
          "Panel Switcher Tutorial", 
          size=(800,600)) 

     self.panel_one = PanelOne(self) 
     self.panel_two = PanelTwo(self) 
     self.panel_two.Hide() 

     self.sizer = wx.BoxSizer(wx.VERTICAL) 
     self.sizer.Add(self.panel_one, 1, wx.EXPAND) 
     self.sizer.Add(self.panel_two, 1, wx.EXPAND) 
     self.SetSizer(self.sizer) 

     menubar = wx.MenuBar() 
     fileMenu = wx.Menu() 
     switch_panels_menu_item = fileMenu.Append(wx.ID_ANY, 
                "Switch Panels", 
                "Some text") 
     self.Bind(wx.EVT_MENU, self.onSwitchPanels, 
        switch_panels_menu_item) 
     menubar.Append(fileMenu, '&File') 
     self.SetMenuBar(menubar) 

    #---------------------------------------------------------------------- 
    def onSwitchPanels(self, event): 

     if self.panel_one.IsShown(): 
      self.SetTitle("Panel Two Showing") 
      self.panel_one.Hide() 
      self.panel_two.Show() 
     else: 
      self.SetTitle("Panel One Showing") 
      self.panel_one.Show() 
      self.panel_two.Hide() 
     self.Layout() 

# Run the program 
if __name__ == "__main__": 
    app = wx.App(False) 
    frame = MyForm() 
    frame.Show() 
    app.MainLoop() 
+0

더 많은 도움을 주실 수 있습니까? 내 코드는 블로그에 게시했습니다. 좋은 직장입니다. – TLSK

+0

당신은 이미 그것을 알고 있습니다 :) – TLSK

+0

네, 나무 쪼그려 앉아있는 문제에 대해서 알고 있습니다. 그러나 버튼을 클릭하면 같은 프레임에서 두 패널을 모두 볼 수 있습니다. 두 번째 패널 만 보여주고 싶습니다. – TLSK