wxPython有条件地显示和隐藏

时间:2015-01-26 07:16:29

标签: jquery python wxpython

我是wxPython的新手,并希望用它来构建一个简单的动态UI,有条件地显示和隐藏一些下拉框,这可以在jQuery中轻松完成。

因此,从我的第一级组合框中,如果用户选择' Op1_1',则会出现第二级组合框A.另一方面,如果' Op1_2'如果选择,则在同一位置生成不同的第二级组合框B.

  1. 问题1:我可以在上面添加第二级组合框 飞,但它的位置不正确。从附图中,你 可以看到它总是在左上角。有没有办法重新定位?
  2. 问题2:如果生成了第一个第二个组合框A,则用户选择“Op1_2”,理论上,组合框B将替换组合框A.但是我遇到了错误{ {1}}。如何销毁以前建造的箱子?
  3. 问题3:有没有办法整合wxPython和jQuery,这可以让我的生活更轻松....
  4. enter image description here

    wxGridBagSizer::Add(): An item is already at that position

2 个答案:

答案 0 :(得分:1)

  1. 尝试调用self.panel.Layout()。没有必要再次使用self.panel.SetSizer(self.sizer)。
  2. 您可以调用wx.Sizer.Remove(窗口)。 wx.Sizer也有替换功能,但我不确定它如何与GridBagSizer一起使用。您还可以创建所有组合框,隐藏或禁用不需要的组合框,并根据需要更改其内容(wx.ComboBox派生自wx.ControlWithItems,并具有成员函数Clear,Delete,Append,Insert)。如果您决定删除组合框,则首先从大小调整器中删除它,然后调用Destroy。
  3. 没有

答案 1 :(得分:1)

您可以使用的方法是创建第二个组合并隐藏它。 当在第一个组合上进行选择时,显示第二个组合并更改其选择以适应。

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()