WxPython.Синхронизация выбора комбо-боксов - PullRequest
0 голосов
/ 09 октября 2018

wxPython У меня есть рамка с тремя панелями.Каждая панель имеет wx.ComboBox. Невозможно создать один wx.ComboBox для нескольких родителей, поэтому у меня есть три разных комбинированных окна на трех панелях с одним и тем же списком для выбора.

Существует ли простой способ синхронизациивыбор для этих комбо-боксов?Например, если что-то выбрать в первом комбинированном окне на первой панели, его следует выбрать во втором и третьем комбинированных окнах на других скрытых панелях.

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Вы можете просто использовать GetSelection() в обратном вызове события и установить все комбинированные списки на полученный результат.
т.е.

import wx

class MyFrame(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, title="Test")
        self.MyList = ["Abc","Def","Ghi"]
        self.panel1 = wx.Panel(self,-1)
        self.panel2 = wx.Panel(self,-1)
        self.panel3 = wx.Panel(self,-1)
        self.Picker1 = wx.ComboBox(self.panel1, pos=(10,10), value="1", size=(100, -1), choices=self.MyList)
        self.text1 = wx.StaticText(self.panel1, -1, "1", pos=(120,10))
        self.Picker2 = wx.ComboBox(self.panel2, pos=(10,10), value="2", size=(100, -1), choices=self.MyList)
        self.text2 = wx.StaticText(self.panel2, -1, "2", pos=(120,10))
        self.Picker3 = wx.ComboBox(self.panel3, pos=(10,10), value="3", size=(100, -1), choices=self.MyList)
        self.text3 = wx.StaticText(self.panel3, -1, "3", pos=(120,10))
        self.Bind(wx.EVT_COMBOBOX, self.EvtComboBox)
        vbox = wx.BoxSizer(wx.VERTICAL)
        vbox.Add(self.panel1)
        vbox.Add(self.panel2)
        vbox.Add(self.panel3)
        self.SetSizer(vbox)
        self.Show()
        self.panel1.SetFocus()
        self.panel2.Hide()
        self.panel3.Hide()

    def EvtComboBox(self,event):
        ev = event.GetSelection()
        self.Picker1.SetSelection(ev)
        self.Picker2.SetSelection(ev)
        self.Picker3.SetSelection(ev)
        self.panel2.Show()
        self.panel3.Show()
        self.Layout()

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

Я добавил простой фрагмент текста рядом с каждым комбинированным списком дляЯсность и изначально скрытые панели 2 и 3, как вы намекаете, что они скрыты, в вашем вопросе.Примечание self.Layout() требуется для отображения скрытых панелей.

0 голосов
/ 15 октября 2018

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

import wx

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

    def __init__(self, parent, selection):
        """Constructor"""
        wx.Panel.__init__(self, parent=parent)

        self.sizer1 = wx.BoxSizer(wx.VERTICAL)
        self.label = wx.StaticText(self, label='Firs panel')

        self.sizer1.Add(selection, 1, wx.EXPAND)
        self.sizer1.Add(self.label, 1, wx.EXPAND)
        self.SetSizer(self.sizer1)


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

    def __init__(self, parent, selection):
        """Constructor"""
        wx.Panel.__init__(self, parent=parent)

        self.sizer2 = wx.BoxSizer(wx.VERTICAL)
        self.labe2 = wx.StaticText(self, label='Second panel')

        self.sizer2.Add(selection, 1, wx.EXPAND)
        self.sizer2.Add(self.labe2, 1, wx.EXPAND)
        self.SetSizer(self.sizer2)


########################################################################
class MyForm(wx.Frame):

    # ----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY,
                          "Panel Switcher Tutorial")

        self.selection = wx.ComboBox(self, size=(200, -1), choices=['One', 'Two', 'Three'], style=wx.CB_DROPDOWN, value='select')

        self.panel_one = PanelOne(self, self.selection)
        self.panel_two = PanelTwo(self, self.selection)
        self.panel_two.Hide()

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

        # make menu
        menubar = wx.MenuBar()
        fileMenu = wx.Menu()
        switch_panels_menu_item = fileMenu.Append(wx.ID_ANY,
                                                  "Switch Panels",
                                                  "Some text")
        self.Bind(wx.EVT_MENU, self.onSwitchPanels,
                  switch_panels_menu_item)
        menubar.Append(fileMenu, '&File')
        self.SetMenuBar(menubar)

    # ----------------------------------------------------------------------
    def onSwitchPanels(self, event):
        """"""
        if self.panel_one.IsShown():
            self.SetTitle("Panel Two Showing")
            self.panel_one.Hide()
            self.panel_two.Show()
        else:
            self.SetTitle("Panel One Showing")
            self.panel_one.Show()
            self.panel_two.Hide()
        self.Layout()


# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm()
    frame.Show()
    app.MainLoop()
0 голосов
/ 09 октября 2018

Я думаю, что самый простой способ - использовать pubsub.Вы можете подписать каждый экземпляр панели на слушателя, а затем, когда вы измените комбинированный список, он может отправить слушателям сообщение, сообщающее им об обновлении.

Я создал простой Notebook с тремя панелями, который демонстрирует концепцию:

import wx
from wx.lib.pubsub import pub 


class TabPanel(wx.Panel):

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

        languages = ['Python', 'C++', 'PHP', 'Go']
        self.combo = wx.ComboBox(self, value='Python', choices=languages, 
                                 size=(80, -1))
        self.combo.Bind(wx.EVT_COMBOBOX, self.on_selection)

        pub.subscribe(self.update_selection, 'combo_update')

    def update_selection(self, selection):
        """
        pubsub listener
        """
        self.combo.SetSelection(selection)

    def on_selection(self, event):
        """
        combobox event handler
        """
        selection = self.combo.GetSelection()
        pub.sendMessage('combo_update', selection=selection)


class MyFrame(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, title='Comboboxes!')
        panel = wx.Panel(self)
        notebook = wx.Notebook(panel)

        for page in range(1, 4):
            tab = TabPanel(notebook)
            notebook.AddPage(tab, 'Tab {}'.format(page))
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(notebook, 1, wx.ALL|wx.EXPAND, 5)
        panel.SetSizer(sizer)

        self.Show()

if __name__ == '__main__':
    app = wx.App(False)
    frame = MyFrame()
    app.MainLoop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...