I don't know how it works with python gtk+ apps, but with C/C++ apps it's quite easy to avoid using a launcher script, I have a setup_paths() function that I run before gtk_init(), that does a job similar to the launcher script, it has the advantage over the LSEnvorinment stuff to be able to bind the resources to the current app bundle path, I'm sharing it here if someone is interested:
void
setup_paths()
{
char execpath[MAXPATHLEN+1];
char path[MAXPATHLEN * 4], *c;
uint32_t pathsz = sizeof (execpath);
_NSGetExecutablePath (execpath, &pathsz);
// if we are not in a bundle let's use the system GTK enviroment...
if (!strstr(execpath, ".app")) {
ILOG << "Not in bundle, doing normal startup";
return;
}
fprintf(stderr, "EXECPATH: %s\n", execpath);
c = strrchr(execpath, '/');
*c = 0;
strcat(execpath, "/../Resources");
chdir(execpath);
getcwd(path, sizeof(path));
fprintf(stderr, "CWD: %s\n", path);
strcpy(path, execpath);
strcat(path, "/lib/gtk-2.0");
setenv ("GTK_PATH", path, 1);
strcpy(path + strlen(execpath), "/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache");
setenv ("GDK_PIXBUF_MODULE_FILE", path, 1);
// pango prefix
strcpy(path + strlen(execpath), "/etc");
setenv("PANGO_SYSCONFDIR", path, 1);
strcpy(path + strlen(execpath), "/lib");
setenv("PANGO_LIBDIR", path, 1);
ILOG << "OSX GTK resource setup completed";
// strcpy(path + strlen(execpath), "/../Resources/share/themes");
// setenv ("GTK_DATA_PREFIX", path, 1);