[pygtk] Passing signals back between Objects

Peter Brooks peter at theneb.co.uk
Sun Aug 19 20:45:14 WST 2007


Hi all, I'm trying the following.
Firstly I extend a base class 'settingSection' into 'streamSettings', I then
chuck in the custom data into 'streamSettings' and then I am able to call
methods such as 'New stream', 'Edit Stream'.
'New Stream' and 'Edit Stream' open up a new object of gtk.Dialog called
'settingsForm', of which I need to pass the data back from 'settingsForm' to
'streamSettings'.
Code relating to this is below:




    class settingsSection(gtk.Frame):
        def __init__(self,data):
            gtk.Frame.__init__(self)
            ########
            # Content
            ########
            self.sl =3D sl =3D  scrollList( data["listColumns"] )
            self.data =3D data
            for item in data["items"]:
                row =3D []
                for col in data["listColumns"]:
                    row.append(data["itemsList"][item][col])
                sl.append_row(row)


            ########
            # UI Manager
            ########
            uimanager =3D gtk.UIManager()
            uimanager.add_ui_from_string(data["ui"])
            actiongroup =3D  gtk.ActionGroup("Settings")
            actiongroup.add_actions( data["actions"] )
            uimanager.insert_action_group(actiongroup, 0)

            ########
            # Layout
            ########
            menubar =3D uimanager.get_widget('/menu')
            vBox =3D gtk.VBox(False,2)
            vBox.show()
            vBox.pack_start(sl)
            vBox.pack_start(menubar)
            self.add(vBox)
            self.show_all()

        def newRow(self):
            items =3D []
            for item in self.data["itemColumns"]:
                items.append( (item, "") )
            settingsForm("Stream",OrderedDict(items))


        def editRow(self):
            label =3D self.sl.get_current()
            if label =3D=3D None:
                return
            items =3D []
            for item in self.data["itemColumns"]:
                items.append( (item,str(self.data["items"][label][item])) )

            settingsForm("Stream",  OrderedDict(items)  )


###########################################################################=
#####

    class streamSettings(settingsSection):
        def __init__(self,db):
            ########
            # Menu
            ########
            ui =3D '''<ui>
                <toolbar name=3D"menu">
                    <toolitem action=3D"New Stream"/>
                    <separator/>
                    <toolitem action=3D"Edit Stream"/>
                    <separator/>
                    <toolitem action=3D"deleteStream"/>
                </toolbar>
                </ui>'''
            actions =3D [('New Stream',gtk.STOCK_NEW, '_New Stream',None,
                    'Create a new stream',lambda x:self.newRow()),
                ('Edit Stream',gtk.STOCK_EDIT, '_Edit Stream', None,
                    'Edit the selected stream',lambda x:self.editRow()),
                ('deleteStream',gtk.STOCK_DELETE, '_Delete Stream', None,
                    'Delete the selected stream',lambda x:sl.remove_row())]
            ########
            # settingItems
            ########
            items =3D {}
            itemsList =3D {}
            connections =3D db.select
("streams","host,port,name","enabled=3D'TRUE'","name")

            for connection in connections:
                items[connection["name"]] =3D {
                        "host": connection["host"],
                        "port": connection["port"] }
                itemsList[connection["name"]] =3D {
                        "name" : connection["name"],
                        "status": "Dummy" }

            data =3D {"ui" : ui ,
                "listColumns" : ("name", "status"),
                "actions" : actions ,
                "itemColumns" : ["Name","Host","Port"],
                "itemsList" : itemsList,
                "items" : items
            }

            settingsSection.__init__(self,data)

        def saveData(self,data):
            if count(select("streams","name","enabled=3D'TRUE' and
name=3D'"+data["name"]+"'"))=3D=3D0:
                db.insert("streams",data)
            else:
                db.update("streams",data,"name=3D"+data["name"])


###########################################################################=
#####

###########################################################################=
#########################
###########################################################################=
#########################


class settingsForm(gtk.Dialog):
    def __init__(self,title,entries):
        gtk.Dialog.__init__(self,title,self,
                                gtk.DIALOG_MODAL |
gtk.DIALOG_DESTROY_WITH_PARENT,
                                (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
                gtk.STOCK_OK, gtk.RESPONSE_OK))

        self.set_size_request(300,50*len(entries))

        self.show()
        vBox =3D self.get_child()
        table =3D gtk.Table(2,3)

        #Render the form fields
        row =3D 0;
        for entry in entries:
            table.attach(gtk.Label(entry),0,1,row,row+1)
            inputBox =3D gtk.Entry(10)
            inputBox.set_text(entries[entry])
            table.attach(inputBox,1,2,row,row+1)
            row+=3D1

        table.show_all()
        vBox.add(table)

        #Handle button reponses
        result =3D self.run()
                if result =3D=3D gtk.RESPONSE_OK  or result =3D=3D
gtk.RESPONSE_APPLY:
            self.saveData()

        if result =3D=3D gtk.RESPONSE_CANCEL or result =3D=3D gtk.RESPONSE_=
OK:
                    self.destroy()

    def saveData(self):
        print ''




Cheers
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.daa.com.au/pipermail/pygtk/attachments/20070819/fdbc8763/at=
tachment.htm


More information about the pygtk mailing list