2012-08-23 4 views
1

나는이 일을하기 위해 많은 것을 수색했지만, 나는 무엇을 시도 했는가에 대해서는 아무것도 찾지 못했다. 지금, 마지막 시도로서, 나는 술집과 함께 노력하고 있습니다. 그러나 나는 가치있는 것을 얻을 수 없습니다. 그래서 나는 지금 도움을 청하고 있습니다. :) 이것은 최소한 (내가 할 수있는 최선의 방법으로) 내가 원하는 것의 예이다. PanelB는 정보를 목록으로 가져옵니다 (상자). 항목 중 누군가가 선택되면 PanelA가 그에 따라 변경해야합니다. 미리 감사드립니다.변수의 함수로 wxpython에서 패널을 재 작성하는 방법은 무엇입니까?

from wx.lib.pubsub import Publisher 
import wx 

global name 
name = 'none, please select an item' 

class PanelA(wx.Panel): 
    def __init__(self, parent, name): 
     wx.Panel.__init__(self, parent) 
     self.hbox = wx.BoxSizer(wx.HORIZONTAL) 
     self.vbox = wx.BoxSizer(wx.VERTICAL) 
     str = name 
     txt = wx.StaticText(self, -1, "You have selected " + str, (20, 100)) 
     self.hbox.Add(txt, 1, wx.EXPAND | wx.ALL, 20) 

class PanelB(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 

     self.hbox = wx.BoxSizer(wx.HORIZONTAL) 
     self.vbox = wx.BoxSizer(wx.VERTICAL) 

     self.listbox = wx.ListBox(self, -1) 
     self.hbox.Add(self.listbox, 1, wx.EXPAND | wx.ALL, 20) 

     self.btnPanel = wx.Panel(self, -1)  
     self.new = wx.Button(self.btnPanel,label='Add', size=(90, 30)) 
     self.new.Bind(wx.EVT_BUTTON, self.NewItem) 

     self.vbox.Add((-1, 20)) 
     self.vbox.Add(self.new) 

     self.btnPanel.SetSizer(self.vbox) 
     self.hbox.Add(self.btnPanel, 0.6, wx.EXPAND | wx.RIGHT, 20) 
     self.SetSizer(self.hbox) 

     self.Bind(wx.EVT_LISTBOX, self.onSelect) 

    def onSelect(self, event): 
     name_selected = self.listbox.GetStringSelection() 
     Publisher().sendMessage(("ListBox"), name_selected) 

def NewItem(self, event): 
     text = wx.GetTextFromUser('Nombre', 'Programa a salvar') 
     if text != '': 
      self.listbox.Append(text) 

class MainFrame(wx.Frame): 
    def __init__(self, parent, id, title, *args, **kw): 

     wx.Frame.__init__(self, parent, id, title, size = (800,300)) 

     self.splitter = wx.SplitterWindow(self, -1, style=wx.SP_3D) 

     self.lc1 = PanelB(self.splitter) 
     Publisher().subscribe(self.OnSelect, ("ListBox")) 
     self.lc2 = PanelA(self.splitter, name) 
     self.splitter.SplitVertically(self.lc1, self.lc2) 

     sizer = wx.BoxSizer(wx.HORIZONTAL) 
     sizer.Add(self.splitter, 1, wx.EXPAND) 
     self.SetSizer(sizer) 

     self.Centre() 
     self.Show(True) 

    def OnSelect(self, name_selected): 
     name = name_selected 
     #I stucked here 

if __name__ == "__main__": 
    app = wx.App() 
    frame = MainFrame(None,-1,'Mi aplicacion') 
    app.MainLoop() 
+0

'메인 프레임'과 통화하는 데 pubsub을 사용하는 것이 좋습니다. 그것은'PanelB' 캡슐화 된 – acattle

답변

0

이것은 기본적으로 당신은 어쩌면 다음과 같이 다시 패널을 호출 패널 a을 파괴 할 수있다, 아름다운 해결책이 아니다 :이 도움이 될 수 있습니다

def OnSelect(self, name_selected): 
    self.lc2.Destroy() 
    self.lc2 = PanelA(self.splitter, name_selected.data) 

희망.

UPDATE (2012년 8월 24일) : 일부 코드

좋아요 우리가 패널을 파괴하지 않아야을 추가했다. 귀하의 코드를 사용하고 조금 수정했습니다. 전역 변수 name을 삭제하고 changeName(name) 함수를 PanelA에 추가하여 MainFrame.onSelect()을 호출하면 changeName()이 호출됩니다. 아름다운 것은 아니지만 이것이 도움이되기를 바랍니다.

import wx 
from wx.lib.pubsub import Publisher 

class PanelA(wx.Panel): 

    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 
     self.hbox = wx.BoxSizer(wx.HORIZONTAL) 
     self.vbox = wx.BoxSizer(wx.VERTICAL) 
     name = "none, please select an item" 
     self.txt = wx.StaticText(self, -1, "You have selected " + name, 
           (50, 100)) 
     self.hbox.Add(self.txt, 1, wx.EXPAND|wx.ALL, 30) 

    def changeName(self, name): 
     self.hbox.Hide(self.txt) 
     self.hbox.Remove(self.txt) 
     self.txt = wx.StaticText(self, -1, "You have selected " + name, (50, 100)) 
     self.hbox.Add(self.txt, 1, wx.EXPAND|wx.ALL, 30) 


class PanelB(wx.Panel): 

    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 

     self.hbox = wx.BoxSizer(wx.HORIZONTAL) 
     self.vbox = wx.BoxSizer(wx.VERTICAL) 

     self.listbox = wx.ListBox(self, -1) 
     self.hbox.Add(self.listbox, 1, wx.EXPAND|wx.ALL, 20) 

     self.btnPanel = wx.Panel(self, -1)  
     self.new = wx.Button(self.btnPanel,label='Add', size=(90, 30)) 
     self.new.Bind(wx.EVT_BUTTON, self.NewItem) 

     self.vbox.Add((-1, 20)) 
     self.vbox.Add(self.new) 

     self.btnPanel.SetSizer(self.vbox) 
     self.hbox.Add(self.btnPanel, 0.6, wx.EXPAND|wx.RIGHT, 20) 
     self.SetSizer(self.hbox) 

     self.Bind(wx.EVT_LISTBOX, self.onSelect) 

    def onSelect(self, event): 
     name_selected = self.listbox.GetStringSelection() 
     Publisher().sendMessage("ListBox", name_selected) 

    def NewItem(self, event): 
     text = wx.GetTextFromUser('Nombre', 'Programa a salvar') 
     if text != '': 
      self.listbox.Append(text) 


class MainFrame(wx.Frame): 

    def __init__(self, parent, id, title, *args, **kw): 

     wx.Frame.__init__(self, parent, id, title, size = (800,300)) 
     self.splitter = wx.SplitterWindow(self, -1, style=wx.SP_3D) 
     Publisher().subscribe(self.OnSelect, "ListBox") 

     self.lc1 = PanelB(self.splitter) 
     self.lc2 = PanelA(self.splitter) 
     self.splitter.SplitVertically(self.lc1, self.lc2) 

     self.sizer = wx.BoxSizer(wx.HORIZONTAL) 
     self.sizer.Add(self.splitter, 1, wx.EXPAND) 
     self.SetSizer(self.sizer) 
     self.Layout() 

     self.Centre() 

    def OnSelect(self, name_selected): 
     name = name_selected 
     self.lc2.changeName(name.data) 


if __name__ == "__main__": 
    app = wx.PySimpleApp() 
    frame = MainFrame(None,-1,'Mi aplicacion') 
    frame.Show() 
    app.MainLoop() 
+0

을 유지합니다. 이제 그 일을 할 수 있습니다, 나는 그것을 나중에하려고 노력할 것입니다. :). 그게 작동하지 않는다. (필자는 나의 프로그램에서, 지금은이 최소한의 예제에서 시도해 보았다.) 패널을 파괴하지만, 재구성 할 수는 없다. – AsVHEn

+0

@AsVHEn 내 대답을 업데이트했습니다. 코드에 수정 사항을 추가하십시오. – Kyomuu

+0

멋진 기능입니다. 고맙습니다. (이제는 프로그램에서 할 수 있다면 시도해 보겠습니다.) – AsVHEn