Your update function is not defined before you try to use it. You need to put it before the property group class.
Here is a simple add-on that is very similar to your original:
bl_info = {
"name": "Addon",
"author": "Your Name Here",
"version": (1, 0),
"blender": (2, 75, 0),
"location": "View3D > Tools > Test Text",
"description": "Description",
"warning": "",
"wiki_url": "",
"category": "Temp",
}
import bpy
from bpy.props import StringProperty, BoolProperty
from bpy.types import PropertyGroup, Panel, Scene
from bpy.utils import register_class, unregister_class
def UpdatedFunction(self, context):
print("In update func...")
return
class MyPropertyGroup(PropertyGroup):
custom_String = StringProperty(name ="My String")
custom_Boolean = BoolProperty(update = UpdatedFunction)
class LayoutPanel(Panel):
bl_label = "Test Text"
bl_space_type = "VIEW_3D"
bl_region_type = "TOOLS"
bl_category = "Tools" # puts it in the tools tab of 3D view tools
#bl_context = "mesh_edit"
def draw(self, context):
scene = bpy.context.scene
layout = self.layout
row = layout.row(align=True)
col = row.column()
col.prop(scene.my_prop_grp, 'custom_String', text="")
col.prop(scene.my_prop_grp, 'custom_Boolean', text="")
classes = (MyPropertyGroup, LayoutPanel)
def register():
for i in classes:
register_class(i)
# storing property in scene for this example
Scene.my_prop_grp = bpy.props.PointerProperty(type=MyPropertyGroup)
def unregister():
for i in classes:
unregister_class(i)
if __name__ == "__main__":
register()
I think you should be able to find your way from there, but let me know if you need further clarification.
Edit:

bl_info = {
"name": "Addon",
"author": "Your Name Here",
"version": (1, 0),
"blender": (2, 75, 0),
"location": "View3D > Tools > Test Text",
"description": "Description",
"warning": "",
"wiki_url": "",
"category": "Temp",
}
import bpy
from bpy.props import StringProperty, BoolProperty, PointerProperty
from bpy.types import PropertyGroup, Panel, Scene
from bpy.utils import register_class, unregister_class
def UpdatedFunction(self, context):
print("In update func...")
print(self.custom_String)
class MyPropertyGroup(PropertyGroup):
custom_String = StringProperty(name ="String Property")
custom_Boolean = BoolProperty(name="Bool Property", update=UpdatedFunction)
class LayoutPanel(Panel):
bl_label = "Test Text"
bl_space_type = "VIEW_3D"
bl_region_type = "TOOLS"
bl_category = "Tools" # puts it in the tools tab of 3D view tools
#bl_context = "mesh_edit"
def draw(self, context):
scene = bpy.context.scene
layout = self.layout
row = layout.row(align=True)
col = row.column()
col.prop(scene.my_prop, 'custom_String', text="")
col.prop(scene.my_prop, 'custom_Boolean', text="")
col.prop(scene.my_other_prop, 'custom_String', text="")
col.prop(scene.my_other_prop, 'custom_Boolean', text="")
classes = (MyPropertyGroup, LayoutPanel)
def register():
for i in classes:
register_class(i)
# storing property in scene for this example
Scene.my_prop = PointerProperty(type=MyPropertyGroup)
Scene.my_other_prop = PointerProperty(type=MyPropertyGroup)
def unregister():
for i in classes:
unregister_class(i)
if __name__ == "__main__":
register()