2015-01-26 3 views
0

Я новичок в wxPython и хотел бы использовать его для создания простого динамического интерфейса, который условно отображает и скрывает некоторые раскрывающиеся окна, которые можно легко выполнить в jQuery.wxPython условно отображать и скрывать

Итак, из моего первого уровня, если пользователь выбирает «Op1_1», появится комбо-поле второго уровня. С другой стороны, если выбрана опция «Op1_2», в том же месте будет создан другой комбинированный блок B второго уровня.

  1. Вопрос 1: Я могу добавить комбо-бокс окна второго уровня на лета, но его расположение не является правильным. Из прилагаемого рисунка вы видите , он всегда смотрит в левый верхний угол. Есть ли способ переделать это?
  2. Вопрос 2: Если сгенерирован первый второй комбинированный блок A, то пользователь выбирает «Op1_2», теоретически, комбинированный блок B заменит поле со списком A. Но я столкнулся с ошибкой wxGridBagSizer::Add(): An item is already at that position. Как уничтожить ранее построенный ящик?
  3. Вопрос 3: Есть ли способ интегрировать WxPython и JQuery, которые могли бы сделать свою жизнь проще ....

enter image description here

import wx 

class landing_frame(wx.Frame): 

    def __init__(self, parent, title):  
     super(landing_frame, self).__init__(parent, title=title, 
      size=(450, 350)) 
     self.font1 = wx.Font(18, wx.DECORATIVE, wx.ITALIC, wx.BOLD) 
     self.InitUI() 
     self.Centre() 
     self.Show()  

    def InitUI(self): 

     self.panel = wx.Panel(self) 
     self.sizer = wx.GridBagSizer(5, 5) 

     self.text1 = wx.StaticText(self.panel, label="Welcome!") 
     self.sizer.Add(self.text1, pos=(0, 0), flag=wx.TOP|wx.LEFT|wx.BOTTOM, border=15) 

     line = wx.StaticLine(self.panel) 
     self.sizer.Add(line, pos=(1, 0), span=(1, 5), flag=wx.EXPAND|wx.BOTTOM, border=10) 

     self.text2 = wx.StaticText(self.panel, label="First Level Dropdown") 
     self.sizer.Add(self.text2, pos=(2, 0), flag=wx.LEFT, border=10) 

     self.sampleList = ['Op1_1', 'Op1_2'] 
     self.combo = wx.ComboBox(self.panel, 30, choices=self.sampleList) 
     self.combo.Bind(wx.EVT_COMBOBOX, self.EvtComboBox) 
     self.sizer.Add(self.combo, pos=(2, 1), span=(1, 2), flag=wx.TOP|wx.EXPAND, border=5) 

     self.panel.SetSizer(self.sizer) 


    def EvtComboBox(self, event): 
     self.user_choice = event.GetString() 
     if self.user_choice == "Op1_1": 
      self.sampleList_ss1 = ['Op2_1_1', 'Op2_1_2', 'Op2_1_3'] 
      self.combo_ss1 = wx.ComboBox(self.panel, 31, choices=self.sampleList_ss1) 
      self.combo_ss1.Bind(wx.EVT_COMBOBOX, self.EvtComboBox) 
      self.sizer.Add(self.combo_ss1, pos=(3, 1), span=(1, 2), flag=wx.TOP|wx.EXPAND, border=5) 
      self.panel.SetSizer(self.sizer) 

     if self.user_choice == "Op1_2": 
      self.sampleList_ss2 = ['Op2_2_1', 'Op2_2_2', 'Op2_2_3'] 
      self.combo_ss2 = wx.ComboBox(self.panel, 31, choices=self.sampleList_ss2) 
      self.combo_ss2.Bind(wx.EVT_COMBOBOX, self.EvtComboBox) 
      self.sizer.Add(self.combo_ss2, pos=(3, 1), span=(1, 2), flag=wx.TOP|wx.EXPAND, border=5) 
      self.panel.SetSizer(self.sizer) 



if __name__ == '__main__': 
    app = wx.App(redirect=False, filename="mylogfile.txt") 
    landing_frame(None, title="Test") 
    app.MainLoop() 

ответ

1

метод можно использовать, чтобы создать 2-й комбо и скрыть его. , когда выбор сделан на 1-й комбо, покажите 2-ю комбо и измените свой выбор.

import wx 


class landing_frame(wx.Frame): 

    def __init__(self, parent, title): 
     super(landing_frame, self).__init__(parent, title=title, 
              size=(450, 350)) 
     self.font1 = wx.Font(18, wx.DECORATIVE, wx.ITALIC, wx.BOLD) 
     self.InitUI() 
     self.Centre() 
     self.Show() 

    def InitUI(self): 

     self.panel = wx.Panel(self) 
     self.sizer = wx.GridBagSizer(5, 5) 

     self.text1 = wx.StaticText(self.panel, label="Welcome!") 
     self.sizer.Add(
      self.text1, pos=(0, 0), 
      flag=wx.TOP | wx.LEFT | wx.BOTTOM, border=15) 

     line = wx.StaticLine(self.panel) 
     self.sizer.Add(
      line, pos=(1, 0), span=(1, 5), 
      flag=wx.EXPAND | wx.BOTTOM, border=10) 

     self.text2 = wx.StaticText(self.panel, label="First Level Dropdown") 
     self.sizer.Add(self.text2, pos=(2, 0), flag=wx.LEFT, border=10) 

     self.sampleList = ['', 'Op1_1', 'Op1_2'] 
     self.combo1 = wx.ComboBox(self.panel, choices=self.sampleList) 
     self.combo1.Bind(wx.EVT_COMBOBOX, self.on_combo1) 
     self.sizer.Add(
      self.combo1, pos=(2, 1), span=(1, 2), flag=wx.TOP | wx.EXPAND, 
      border=5) 

     self.combo2 = wx.ComboBox(self.panel) 
     self.combo2.Bind(wx.EVT_COMBOBOX, self.on_combo2) 
     self.sizer.Add(
      self.combo2, pos=(3, 1), span=(1, 2), flag=wx.TOP | wx.EXPAND, 
      border=5) 

     self.panel.SetSizer(self.sizer) 
     self.Layout() 
     wx.CallAfter(self.combo2.Show, False) 

    def on_combo1(self, event): 
     self.user_choice = event.GetString() 
     if self.user_choice == '': 
      self.combo2.Show(False) 
      self.combo2.Clear() 
      return 
     self.combo2.Show(True) 

     if self.user_choice == "Op1_1": 
      self.combo2.SetItems(('Op2_1_1', 'Op2_1_2', 'Op2_1_3')) 

     elif self.user_choice == "Op1_2": 
      self.combo2.SetItems(('Op2_2_1', 'Op2_2_2', 'Op2_2_3')) 

    def on_combo2(self, event): 
     print '2nd combo choice: {}'.format(event.GetString()) 


if __name__ == '__main__': 
    app = wx.App(redirect=False) 
    landing_frame(None, title="Test") 
    app.MainLoop() 
+0

Спасибо за доказательство решения. Есть ли лучший способ заменить этот второй «комбинированный блок» другими типами элементов, например «поле ввода текста»? Кроме того, любое предложение улучшить графический интерфейс 'wxPython' более динамичный? –

1
  1. Попробуйте позвонить self.panel.Layout (). Нет необходимости снова делать self.panel.SetSizer (self.sizer).
  2. Вы можете позвонить в wx.Sizer.Remove (window). У wx.Sizer также есть функция replace, но я не уверен, как это работает с GridBagSizer. Вы также можете создавать все свои комбинированные поля, скрывать или отключать те, которые вам не нужны, и изменять их содержимое по мере необходимости (wx.ComboBox происходит из wx.ControlWithItems и имеет функции-члены Clear, Delete, Append, Insert). Если вы решите удалить поля со списком, сначала удалите его из sizer и вызовите Destroy.
  3. No.
+0

Спасибо за ваш ответ! Что касается Q3, любой подход к улучшению динамического wxPython Gui? –

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