Search code examples
pythonwxpythontuplespanels

Passing a tuple between two Panels in wxPython


I am trying to pass the tuple of the the checked strings in one panel to the textCtrl widget in another panel. I thought that if I polled the panel class containing the checklistbox widget for the checked boxes and set that equal to an attribute of the panel class containing the TextCtrl widget I could do things in the TextCtrl widget based on the boxes that are checked

I also tried using pubsub but I was having difficulty and wasn't sure if this was the case that you would use it or not.

As a disclaimer I am new to object oriented programming and python. I am making progress in learning object oriented programming but there are still things that are a bit fuzzy for me.

Here is my code:

#! /usr/bin/python

# Trying to do things in a separate panel based on
# events that happen in another panel

import wx

# ----- Functions




# ----- Classes
class chkbxPanel(wx.Panel):
    # This class defines the panel that will
    # contain the checkbox
    def __init__(self, parent):
        wx.Panel.__init__(self,parent=parent, id=-1)
        # Widgets
        List = ['one','two','three']
        Prompt = 'Please Make a Choice'
        self.ChkBx = wx.CheckListBox(self,id=-1,choices=List,size=(-1,200))
        self.PromptChkBx = wx.StaticText(self,id=-1,label=Prompt)

        # Page Sizers
        self.panel_vertSizer=wx.BoxSizer(wx.VERTICAL)
        self.panel_vertSizer.Add(self.PromptChkBx,proportion=0,flag=wx.ALIGN_LEFT)
        self.panel_vertSizer.Add(self.ChkBx,proportion=0,flag=wx.ALIGN_LEFT)

        # Invoke Sizer
        self.SetSizer(self.panel_vertSizer)

        # Make 'self' (the panel) shrink to the minimum size 
        # required by the controls
        self.Fit()
        # end __init__
    # ----- Functions

class resultsPanel(wx.Panel):
    # This class define the panel that will 
    # contain the textctrl 
    def __init__ (self,parent):
        wx.Panel.__init__(self,parent=parent,id=-1)
        # Widgets
        ResultsPanelTitle = 'Results:'
        self.ResultsTitle = wx.StaticText(self, id=-1, label= ResultsPanelTitle)
        self.Results = wx.TextCtrl(self, id=-1,size=(300,500),style=(wx.TE_MULTILINE|wx.TE_READONLY|wx.TE_DONTWRAP))
        self.CheckedBxs = ()

        lenofcb = len(self.CheckedBxs)
        typeofcb = type(self.CheckedBxs)
        self.Results.AppendText('How Many Boxes are Checkd:\n')
        self.Results.AppendText(str(lenofcb)+'\n')
        self.Results.AppendText(str(typeofcb)+'\n')
        # Page Sizer
        self.panel_vertSizer = wx.BoxSizer(wx.VERTICAL)
        self.panel_vertSizer.Add(self.ResultsTitle,proportion=0, flag=wx.ALIGN_LEFT)
        self.panel_vertSizer.Add(self.Results, proportion=0, flag=wx.ALIGN_LEFT)

        # Invoke Sizer
        self.SetSizer(self.panel_vertSizer)

        # Make 'self' (the panel) shrink to the minimum size
        # required by the controls 
        self.Fit()

        # end __init__

    # ----- Functions


# ----- Main Frame
class MainFrame(wx.Frame):
    # A 2-Control Class With BoxSizers
    def __init__(self):
        # Configure the Figure
        titleText = 'Wx Question'
        wx.Frame.__init__(  self, None, title=titleText
                        ,size=(600,300), style=wx.DEFAULT_FRAME_STYLE)

        # First Frame Control automatically expands to the 
        # Frame's client size
        frame_panel = wx.Panel(self)

        # Create the Controls
        LeftPanel = chkbxPanel(frame_panel)
        RightPanel = resultsPanel(frame_panel)
        RightPanel.CheckedBxs = LeftPanel.ChkBx.GetCheckedStrings()
        RightPanel.CheckedBxs = ('one','two')

        # Create Sizers and add the controls
        panelCtrls_horzSizer = wx.BoxSizer(wx.HORIZONTAL)
        panelCtrls_horzSizer.Add(LeftPanel)
        panelCtrls_horzSizer.Add(RightPanel)

        framePanel_vertSizer = wx.BoxSizer(wx.VERTICAL)
        framePanel_vertSizer.Add(panelCtrls_horzSizer)

        frame_panel.SetSizer(framePanel_vertSizer)
        frame_panel.Fit()
        self.SetSize((600,600))






# Main if statement
if __name__ == '__main__':
    app = wx.PySimpleApp(redirect=False)
    appFrame = MainFrame().Show()
    app.MainLoop()

Thank you for any help


Solution

  • You could do your event binding in the parent class as it has access to both panels

    #! /usr/bin/python
    
    # Trying to do things in a separate panel based on
    # events that happen in another panel
    
    import wx
    
    # ----- Functions
    
    
    
    
    # ----- Classes
    class ChkbxPanel(wx.Panel):
        # This class defines the panel that will
        # contain the checkbox
        def __init__(self, parent):
            wx.Panel.__init__(self, parent=parent, id=-1)
            # Widgets
            choices = ['one', 'two', 'three']
            prompt = 'Please Make a Choice'
            self.chkBx = wx.CheckListBox(self, choices=choices, size=(-1, 200))
            self.PromptChkBx = wx.StaticText(self, label=prompt)
    
            # Page Sizers
            self.panel_vertSizer = wx.BoxSizer(wx.VERTICAL)
            self.panel_vertSizer.Add(self.PromptChkBx, proportion=0,
                                     flag=wx.ALIGN_LEFT)
            self.panel_vertSizer.Add(self.chkBx, proportion=0, flag=wx.ALIGN_LEFT)
    
            # Invoke Sizer
            self.SetSizer(self.panel_vertSizer)
    
            # Make 'self' (the panel) shrink to the minimum size
            # required by the controls
            self.Fit()
            # end __init__
        # ----- Functions
    
    
    class ResultsPanel(wx.Panel):
        # This class define the panel that will
        # contain the textctrl
        def __init__ (self, parent):
            wx.Panel.__init__(self, parent=parent, id=-1)
            # Widgets
            resultsPanelTitle = 'Results:'
            self.resultsTitle = wx.StaticText(self, label=resultsPanelTitle)
            self.results = wx.TextCtrl(self, size=(300, 500),
                        style=(wx.TE_MULTILINE | wx.TE_READONLY | wx.TE_DONTWRAP))
            self.CheckedBxs = ()
    
            lenofcb = len(self.CheckedBxs)
            typeofcb = type(self.CheckedBxs)
            self.results.AppendText('How Many Boxes are Checkd:\n')
            self.results.AppendText(str(lenofcb) + '\n')
            self.results.AppendText(str(typeofcb) + '\n')
            # Page Sizer
            self.panel_vertSizer = wx.BoxSizer(wx.VERTICAL)
            self.panel_vertSizer.Add(self.resultsTitle, proportion=0, flag=wx.ALIGN_LEFT)
            self.panel_vertSizer.Add(self.results, proportion=0, flag=wx.ALIGN_LEFT)
    
            # Invoke Sizer
            self.SetSizer(self.panel_vertSizer)
    
            # Make 'self' (the panel) shrink to the minimum size
            # required by the controls
            self.Fit()
    
            # end __init__
    
        # ----- Functions
    
    
    # ----- Main Frame
    class MainFrame(wx.Frame):
        # A 2-Control Class With BoxSizers
        def __init__(self):
            # Configure the Figure
            titleText = 'Wx Question'
            wx.Frame.__init__(self, None, title=titleText
                            , size=(600, 300), style=wx.DEFAULT_FRAME_STYLE)
    
            # First Frame Control automatically expands to the
            # Frame's client size
            frame_panel = wx.Panel(self)
    
            # Create the Controls
            leftPanel = ChkbxPanel(frame_panel)
            self.rightPanel = ResultsPanel(frame_panel)
    
            # Create Sizers and add the controls
            panelCtrls_horzSizer = wx.BoxSizer(wx.HORIZONTAL)
            panelCtrls_horzSizer.Add(leftPanel)
            panelCtrls_horzSizer.Add(self.rightPanel)
    
            framePanel_vertSizer = wx.BoxSizer(wx.VERTICAL)
            framePanel_vertSizer.Add(panelCtrls_horzSizer)
    
            frame_panel.SetSizer(framePanel_vertSizer)
            frame_panel.Fit()
            self.SetSize((600, 600))
    
            leftPanel.chkBx.Bind(wx.EVT_CHECKLISTBOX, self.onCheckBox)
    
        def onCheckBox(self, event):
            checked = event.EventObject.CheckedStrings
            self.rightPanel.results.AppendText(
                'Checked: {0}, Qty checked: {1}\n'.format(checked, len(checked)))
    
    
    
    # Main if statement
    if __name__ == '__main__':
        app = wx.App(redirect=False)
        appFrame = MainFrame().Show()
        app.MainLoop()