2013-07-09 4 views
0

Я собираюсь начать создание приложения python (2.7) - с помощью wx, но я все еще располагаю несколькими теоретическими стенами, заставляя меня скептически относиться к практическому успеху.python макет/вопросы функциональности

Ниже приведено несколько вопросов: 1) Мое приложение будет иметь множество виджетов (кнопки, записи, метки, comboboxes) , записи, выпадающие списки и кнопки). Мой вопрос здесь в том, как я могу отслеживать этот динамический контент, я также хочу иметь вариант удаления. Мое лучшее предположение было списком, но я все еще не уверен, как я могу обработать что-то вроде combobox + im kinda lost на том, как я могу удалить группу виджетов.

2) какая практика размещения виджетов лучше всего подходит для рамки/панелей фиксированного размера? Будет ли ручная настройка xypos просто прекрасной? Даже учитывая мои вопросы в 1) - в основном интересуется, как обращаться с макетом, если что-то в середине кадра удаляется - дыры не будут приятными.

Большое спасибо

ответ

0

Я бы узнать классификатор, если вы собираетесь добавлять и удалять виджеты. Если вы собираетесь добавить ряд виджетов, тогда поместите все эти виджеты в свой собственный sizer. Вот пример для добавления строки виджетов:

import wx 

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

    #---------------------------------------------------------------------- 
    def __init__(self, parent): 
     """Constructor""" 
     wx.Panel.__init__(self, parent) 
     self.id = 1 
     self.row_dict = {} 

     self.mainSizer = wx.BoxSizer(wx.VERTICAL) 

     addBtn = wx.Button(self, label="Add") 
     addBtn.Bind(wx.EVT_BUTTON, self.onAdd) 

     self.mainSizer.Add(addBtn, 0, wx.ALL|wx.CENTER, 5) 
     self.SetSizer(self.mainSizer) 

    #---------------------------------------------------------------------- 
    def onAdd(self, event): 
     """ 
     Add row of widgets 
     """ 
     sizer = wx.BoxSizer(wx.HORIZONTAL) 

     label = wx.StaticText(self, label="Test") 
     removeBtn = wx.Button(self, label="Remove row", name=str(self.id)) 
     removeBtn.Bind(wx.EVT_BUTTON, self.onRemove) 

     self.row_dict[str(self.id)] = sizer 

     self.id += 1 

     sizer.Add(label, 0, wx.ALL, 5) 
     sizer.Add(removeBtn, 0, wx.ALL, 5) 
     self.mainSizer.Add(sizer) 
     self.mainSizer.Layout() 

    #---------------------------------------------------------------------- 
    def onRemove(self, event): 
     """ 
     Remove row 
     """ 
     btn = event.GetEventObject() 
     name = btn.GetName() 
     print name 
     print "removing => ", self.row_dict[name] 
     sizer = self.row_dict[name] 
     for child in sizer.GetChildren(): 
      widget = child.GetWindow() 
      print widget 
      sizer.Remove(widget) 

     #self.mainSizer.Remove(self.row_dict[name]) 
     self.mainSizer.Layout() 
     self.Layout() 

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

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """Constructor""" 
     wx.Frame.__init__(self, None, title="Add Widgets") 
     panel = MyPanel(self) 
     self.Show() 

if __name__ == "__main__": 
    app = wx.App(False) 
    frame = MyFrame() 
    app.MainLoop() 

Я не был в состоянии получить метод удалить, чтобы работать должным образом, но метод добавь работает. Надеюсь, это поможет вам хотя бы начать.

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