2012-06-25 4 views
0

У меня есть wx.Frame. Мне нужно время от времени менять контент. У меня есть таймер, и каждые несколько секунд я проверяю состояние, и если состояние было изменено, мне нужно изменить содержимое фрейма.Каков рекомендуемый способ перерисовать содержимое wxframe?

Для этого я создал панель в кадре с именем panel.Reparent(None) и создал панель с новым контентом, но кадр не обновляется вновь созданной панелью. Я попытался с уничтожить (panel.Destroy()), но это не сработало.

Каков рекомендуемый способ изменения содержимого кадра (а не только данные, мне нужно добавить и удалить компоненты пользовательского интерфейса)?

класс TestFrame (wx.Frame): Защиту INIT (Я): wx.Frame. init (self, None, title = "Double Buffered Drawing") self.counter = 0 self.panel = wx.Panel (self, -1) wx.CheckBox (self.panel, -1, "Alpha »(35, 40), (150, 20))

# Create a timer to update the data values 
    self.Bind(wx.EVT_TIMER, self.OnTimeout) 
    self.timer = wx.Timer(self) 
    self.timer.Start(5000) 


def OnTimeout(self, evt): 
    p = self.panel 
    self.counter = self.counter + 1 
    try: 
     p.Reparent(None) 
    except e: 
     print 'B' 
    if self.counter % 2 == 0: 
     self.panel = wx.Panel(self, -1) 
     wx.CheckBox(self.panel, -1, "Alpha", (35, 40), (150, 20)) 
     self.Show() #Tried also self.Layout self.Refresh self.Update 

ответ

1

При добавлении или удалении виджетов во время выполнения, вы почти всегда должны вызывать Layout() после удаления или добавления виджета. Обычно вызов Layout на родительском sizer выполняет трюк, но иногда вам приходится вызывать его в объекте фрейма. Вы можете увидеть один пример here, где я просто спрятал одну панель и показал другую.

Я также написал еще один учебник на самом деле removing or adding widgets динамически. Это тоже поможет вам.

EDIT (6-26-12): Так как OP, кажется, требует пример, я написал самоуничтожающимися панель:

import wx 

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

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

     self.countdown = wx.StaticText(self, label="This panel will self-destruct in 10 seconds") 


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

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

     txt = wx.StaticText(self, label="Panel Two") 


######################################################################## 
class MainFrame(wx.Frame): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """Constructor""" 
     wx.Frame.__init__(self, None, title="Panel Smacker") 
     self.panelOne = PanelOne(self) 
     self.time2die = 10 

     self.timer = wx.Timer(self) 
     self.Bind(wx.EVT_TIMER, self.update, self.timer) 
     self.timer.Start(1000) 

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

    #---------------------------------------------------------------------- 
    def update(self, event): 
     """""" 
     if self.time2die < 0: 
      self.panelOne.Destroy() 
      self.panelTwo = PanelTwo(self) 
      self.sizer.Add(self.panelTwo, 1, wx.EXPAND) 
      self.Layout() 
      self.timer.Stop() 
     else: 
      msg = "This panel will self-destruct in %s seconds" % self.time2die 
      self.panelOne.countdown.SetLabel(msg) 
     self.time2die -= 1 

if __name__ == "__main__": 
    app = wx.App(False) 
    frame = MainFrame() 
    frame.Show() 
    app.MainLoop() 
+0

Спасибо большое за вашу помощь. Ваши примеры замечательные, но я ищу способ завершить удаление старой панели и создать новую с другими виджетами. Мое приложение - это приложение для управления управления, поэтому мне нужно время от времени проверять состояние и на основе панели создания состояния. Кстати я не уверен, если связанный с ним я получаю эти предупреждения: (python2.7: 6210): GLib-GObject-WARNING **: неверный unclassed указатель в гипсе на 'GtkPizza» (python2.7 : 6210): GLib-GObject-WARNING **: неверный листинг из '(null) 'в' GtkObject' – user1236097

+0

Во втором учебном пособии показано, как удалить виджеты. Просто уничтожьте панель и вставьте новую. –

+0

WOW и снова WOW. Работает, если я использую sizer. – user1236097

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