mirror of
https://github.com/python/cpython.git
synced 2026-01-04 22:42:14 +00:00
Mods by Tony Lownds (patch 490100, slightly massaged by me) to make Tkinter
work with Mac OS X Aqua-Tk, all nicely within ifdefs. The process is not for the faint of heart, though: you need to download and install the (alfa) Aqua-Tk, obtain a few needed X11 headers from somewhere else and then everything builds. To run scripts using Tkinter you must build with --enable-framework, build Python.app in Mac/OSX and run your Tkinter scripts with that. Then, about half the tests in Demo/tkinter work (or at least do something). Checking this in anyway because it shouldn't break anything, and newer versions of Aqua-Tk will streamline the process.
This commit is contained in:
parent
edeea04bfd
commit
cb85244228
2 changed files with 74 additions and 1 deletions
|
|
@ -41,8 +41,13 @@ Copyright (C) 1994 Steen Lumholt.
|
|||
#define MAC_TCL
|
||||
#endif
|
||||
|
||||
#ifdef TK_FRAMEWORK
|
||||
#include <Tcl/tcl.h>
|
||||
#include <Tk/tk.h>
|
||||
#else
|
||||
#include <tcl.h>
|
||||
#include <tk.h>
|
||||
#endif
|
||||
|
||||
#define TKMAJORMINOR (TK_MAJOR_VERSION*1000 + TK_MINOR_VERSION)
|
||||
|
||||
|
|
@ -454,6 +459,7 @@ Tkapp_New(char *screenName, char *baseName, char *className, int interactive)
|
|||
ClearMenuBar();
|
||||
TkMacInitMenus(v->interp);
|
||||
#endif
|
||||
|
||||
/* Delete the 'exit' command, which can screw things up */
|
||||
Tcl_DeleteCommand(v->interp, "exit");
|
||||
|
||||
|
|
@ -1580,7 +1586,7 @@ Tktt_Repr(PyObject *self)
|
|||
char buf[100];
|
||||
|
||||
PyOS_snprintf(buf, sizeof(buf), "<tktimertoken at %p%s>", v,
|
||||
v->func == NULL ? ", handler deleted" : "");
|
||||
v->func == NULL ? ", handler deleted" : "");
|
||||
return PyString_FromString(buf);
|
||||
}
|
||||
|
||||
|
|
@ -2137,6 +2143,22 @@ init_tkinter(void)
|
|||
Tktt_Type.ob_type = &PyType_Type;
|
||||
PyDict_SetItemString(d, "TkttType", (PyObject *)&Tktt_Type);
|
||||
|
||||
|
||||
#ifdef TK_AQUA
|
||||
/* Tk_MacOSXSetupTkNotifier must be called before Tcl's subsystems
|
||||
* start waking up. Note that Tcl_FindExecutable will do this, this
|
||||
* code must be above it! The original warning from
|
||||
* tkMacOSXAppInit.c is copied below.
|
||||
*
|
||||
* NB - You have to swap in the Tk Notifier BEFORE you start up the
|
||||
* Tcl interpreter for now. It probably should work to do this
|
||||
* in the other order, but for now it doesn't seem to.
|
||||
*
|
||||
*/
|
||||
Tk_MacOSXSetupTkNotifier();
|
||||
#endif
|
||||
|
||||
|
||||
/* This helps the dynamic loader; in Unicode aware Tcl versions
|
||||
it also helps Tcl find its encodings. */
|
||||
Tcl_FindExecutable(Py_GetProgramName());
|
||||
|
|
|
|||
|
|
@ -20,13 +20,64 @@ Tcl_AppInit(Tcl_Interp *interp)
|
|||
{
|
||||
Tk_Window main_window;
|
||||
|
||||
#ifdef TK_AQUA
|
||||
#ifndef MAX_PATH_LEN
|
||||
#define MAX_PATH_LEN 1024
|
||||
#endif
|
||||
char tclLibPath[MAX_PATH_LEN], tkLibPath[MAX_PATH_LEN];
|
||||
Tcl_Obj* pathPtr;
|
||||
|
||||
/* pre- Tcl_Init code copied from tkMacOSXAppInit.c */
|
||||
Tk_MacOSXOpenBundleResources (interp, "com.tcltk.tcllibrary",
|
||||
tclLibPath, MAX_PATH_LEN, 0);
|
||||
|
||||
if (tclLibPath[0] != '\0') {
|
||||
Tcl_SetVar(interp, "tcl_library", tclLibPath, TCL_GLOBAL_ONLY);
|
||||
Tcl_SetVar(interp, "tclDefaultLibrary", tclLibPath, TCL_GLOBAL_ONLY);
|
||||
Tcl_SetVar(interp, "tcl_pkgPath", tclLibPath, TCL_GLOBAL_ONLY);
|
||||
}
|
||||
|
||||
if (tclLibPath[0] != '\0') {
|
||||
Tcl_SetVar(interp, "tcl_library", tclLibPath, TCL_GLOBAL_ONLY);
|
||||
Tcl_SetVar(interp, "tclDefaultLibrary", tclLibPath, TCL_GLOBAL_ONLY);
|
||||
Tcl_SetVar(interp, "tcl_pkgPath", tclLibPath, TCL_GLOBAL_ONLY);
|
||||
}
|
||||
#endif
|
||||
if (Tcl_Init (interp) == TCL_ERROR)
|
||||
return TCL_ERROR;
|
||||
|
||||
#ifdef TK_AQUA
|
||||
/* pre- Tk_Init code copied from tkMacOSXAppInit.c */
|
||||
Tk_MacOSXOpenBundleResources (interp, "com.tcltk.tklibrary",
|
||||
tkLibPath, MAX_PATH_LEN, 1);
|
||||
|
||||
if (tclLibPath[0] != '\0') {
|
||||
pathPtr = Tcl_NewStringObj(tclLibPath, -1);
|
||||
} else {
|
||||
Tcl_Obj *pathPtr = TclGetLibraryPath();
|
||||
}
|
||||
|
||||
if (tkLibPath[0] != '\0') {
|
||||
Tcl_Obj *objPtr;
|
||||
|
||||
Tcl_SetVar(interp, "tk_library", tkLibPath, TCL_GLOBAL_ONLY);
|
||||
objPtr = Tcl_NewStringObj(tkLibPath, -1);
|
||||
Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
|
||||
}
|
||||
|
||||
TclSetLibraryPath(pathPtr);
|
||||
#endif
|
||||
|
||||
if (Tk_Init (interp) == TCL_ERROR)
|
||||
return TCL_ERROR;
|
||||
|
||||
main_window = Tk_MainWindow(interp);
|
||||
|
||||
#ifdef TK_AQUA
|
||||
TkMacOSXInitAppleEvents(interp);
|
||||
TkMacOSXInitMenus(interp);
|
||||
#endif
|
||||
|
||||
#ifdef WITH_MOREBUTTONS
|
||||
{
|
||||
extern Tcl_CmdProc studButtonCmd;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue