1 /* tkintermodule.c -- Interface to libtk.a and libtcl.a.
2 Copyright (C) 1994 Steen Lumholt */
6 #define PyInit_tkinter inittkinter
11 extern char *getprogramname ();
13 /* Internal declarations from tkInt.h. */
14 extern int tk_NumMainWindows
;
15 extern struct { Tk_Window win
; } *tkMainWindowList
;
17 /**** Tkapp Object Declaration ****/
19 staticforward PyTypeObject Tkapp_Type
;
29 #define Tkapp_Check(v) ((v)->ob_type == &Tkapp_Type)
30 #define Tkapp_Tkwin(v) (((TkappObject *) (v))->tkwin)
31 #define Tkapp_Interp(v) (((TkappObject *) (v))->interp)
32 #define Tkapp_Result(v) (((TkappObject *) (v))->interp->result)
34 #define DEBUG_REFCNT(v) (printf ("DEBUG: id=%p, refcnt=%i\n", \
35 (void *) v, ((PyObject *) v)->ob_refcnt))
37 /**** Error Handling ****/
39 static PyObject
*Tkinter_TclError
;
40 static int quitMainLoop
= 0;
41 static int errorInCmd
= 0;
42 static PyObject
*excInCmd
;
43 static PyObject
*valInCmd
;
44 static PyObject
*trbInCmd
;
50 PyErr_SetString (Tkinter_TclError
, Tkapp_Result (v
));
55 PythonCmd_Error (interp
)
59 PyErr_Fetch (&excInCmd
, &valInCmd
, &trbInCmd
);
70 if (PyString_Check (value
))
71 return PyString_AsString (value
);
76 v
= strobject (value
);
77 PyList_Append (tmp
, v
);
79 return PyString_AsString (v
);
90 char *argvStore
[ARGSZ
];
102 if (!PyTuple_Check (args
))
106 argv
[0] = AsString (args
, tmp
);
112 if (PyTuple_Size (args
) > ARGSZ
)
114 argv
= malloc (PyTuple_Size (args
) * sizeof (char *));
115 fv
= malloc (PyTuple_Size (args
) * sizeof (int));
116 if (argv
== NULL
|| fv
== NULL
)
120 argc
= PyTuple_Size (args
);
121 for (i
= 0; i
< argc
; i
++)
123 v
= PyTuple_GetItem (args
, i
);
124 if (PyTuple_Check (v
))
129 else if (v
== Py_None
)
137 argv
[i
] = AsString (v
, tmp
);
142 res
= Tcl_Merge (argc
, argv
);
145 for (i
= 0; i
< argc
; i
++)
146 if (fv
[i
]) free (argv
[i
]);
147 if (argv
!= argvStore
)
170 if (Tcl_SplitList (Tkapp_Interp (self
), list
, &argc
, &argv
) == TCL_ERROR
)
171 return Tkinter_Error (self
);
174 v
= PyString_FromString ("");
176 v
= PyString_FromString (argv
[0]);
181 v
= PyTuple_New (argc
);
182 for (i
= 0; i
< argc
; i
++)
183 PyTuple_SetItem (v
, i
, Split (self
, argv
[i
]));
190 /**** Tkapp Object ****/
197 if (Tcl_Init (interp
) == TCL_ERROR
)
199 if (Tk_Init (interp
) == TCL_ERROR
)
203 #endif /* !WITH_APPINIT */
205 /* Initialize the Tk application; see the `main' function in
208 Tkapp_New (screenName
, baseName
, className
, interactive
)
216 v
= PyObject_NEW (TkappObject
, &Tkapp_Type
);
220 v
->interp
= Tcl_CreateInterp ();
221 v
->tkwin
= Tk_CreateMainWindow (v
->interp
, screenName
,
222 baseName
, className
);
223 if (v
->tkwin
== NULL
)
224 return (TkappObject
*) Tkinter_Error ((PyObject
*) v
);
226 Tk_GeometryRequest (v
->tkwin
, 200, 200);
228 if (screenName
!= NULL
)
229 Tcl_SetVar2 (v
->interp
, "env", "DISPLAY", screenName
, TCL_GLOBAL_ONLY
);
232 Tcl_SetVar (v
->interp
, "tcl_interactive", "1", TCL_GLOBAL_ONLY
);
234 Tcl_SetVar (v
->interp
, "tcl_interactive", "0", TCL_GLOBAL_ONLY
);
236 if (Tcl_AppInit (v
->interp
) != TCL_OK
)
238 PyErr_SetString (Tkinter_TclError
, "Tcl_AppInit failed"); /* XXX */
248 Tkapp_Call (self
, args
)
255 if (Tcl_Eval (Tkapp_Interp (self
), cmd
) == TCL_ERROR
)
258 return Tkinter_Error (self
);
262 return PyString_FromString (Tkapp_Result (self
));
266 Tkapp_GlobalCall (self
, args
)
273 if (Tcl_GlobalEval (Tkapp_Interp (self
), cmd
) == TCL_ERROR
)
276 return Tkinter_Error (self
);
280 return PyString_FromString (Tkapp_Result (self
));
284 Tkapp_Eval (self
, args
)
290 if (!PyArg_Parse (args
, "s", &script
))
293 if (Tcl_Eval (Tkapp_Interp (self
), script
) == TCL_ERROR
)
294 return Tkinter_Error (self
);
296 return PyString_FromString (Tkapp_Result (self
));
300 Tkapp_GlobalEval (self
, args
)
306 if (!PyArg_Parse (args
, "s", &script
))
309 if (Tcl_GlobalEval (Tkapp_Interp (self
), script
) == TCL_ERROR
)
310 return Tkinter_Error (self
);
312 return PyString_FromString (Tkapp_Result (self
));
316 Tkapp_EvalFile (self
, args
)
322 if (!PyArg_Parse (args
, "s", &fileName
))
325 if (Tcl_EvalFile (Tkapp_Interp (self
), fileName
) == TCL_ERROR
)
326 return Tkinter_Error (self
);
328 return PyString_FromString (Tkapp_Result (self
));
332 Tkapp_Record (self
, args
)
338 if (!PyArg_Parse (args
, "s", &script
))
341 if (Tcl_RecordAndEval (Tkapp_Interp (self
),
342 script
, TCL_NO_EVAL
) == TCL_ERROR
)
343 return Tkinter_Error (self
);
345 return PyString_FromString (Tkapp_Result (self
));
349 Tkapp_AddErrorInfo (self
, args
)
355 if (!PyArg_Parse (args
, "s", &msg
))
357 Tcl_AddErrorInfo (Tkapp_Interp (self
), msg
);
366 SetVar (self
, args
, flags
)
371 char *name1
, *name2
, *ok
;
375 tmp
= PyList_New (0);
377 if (PyArg_Parse (args
, "(sO)", &name1
, &newValue
))
378 ok
= Tcl_SetVar (Tkapp_Interp (self
), name1
,
379 AsString (newValue
, tmp
), flags
); /* XXX Merge? */
380 else if (PyArg_Parse (args
, "(ssO)", &name1
, &name2
, &newValue
))
381 ok
= Tcl_SetVar2 (Tkapp_Interp (self
), name1
, name2
,
382 AsString (newValue
, tmp
), flags
);
391 return Tkinter_Error (self
);
398 Tkapp_SetVar (self
, args
)
402 return SetVar (self
, args
, TCL_LEAVE_ERR_MSG
);
406 Tkapp_GlobalSetVar (self
, args
)
410 return SetVar (self
, args
, TCL_LEAVE_ERR_MSG
| TCL_GLOBAL_ONLY
);
414 GetVar (self
, args
, flags
)
419 char *name1
, *name2
, *s
;
421 if (PyArg_Parse (args
, "s", &name1
))
422 s
= Tcl_GetVar (Tkapp_Interp (self
), name1
, flags
);
423 else if (PyArg_Parse (args
, "(ss)", &name1
, &name2
))
424 s
= Tcl_GetVar2 (Tkapp_Interp (self
), name1
, name2
, flags
);
429 return Tkinter_Error (self
);
431 return PyString_FromString (s
);
435 Tkapp_GetVar (self
, args
)
439 return GetVar (self
, args
, TCL_LEAVE_ERR_MSG
);
443 Tkapp_GlobalGetVar (self
, args
)
447 return GetVar (self
, args
, TCL_LEAVE_ERR_MSG
| TCL_GLOBAL_ONLY
);
451 UnsetVar (self
, args
, flags
)
459 if (PyArg_Parse (args
, "s", &name1
))
460 code
= Tcl_UnsetVar (Tkapp_Interp (self
), name1
, flags
);
461 else if (PyArg_Parse (args
, "(ss)", &name1
, &name2
))
462 code
= Tcl_UnsetVar2 (Tkapp_Interp (self
), name1
, name2
, flags
);
466 if (code
== TCL_ERROR
)
467 return Tkinter_Error (self
);
474 Tkapp_UnsetVar (self
, args
)
478 return UnsetVar (self
, args
, TCL_LEAVE_ERR_MSG
);
482 Tkapp_GlobalUnsetVar (self
, args
)
486 return UnsetVar (self
, args
, TCL_LEAVE_ERR_MSG
| TCL_GLOBAL_ONLY
);
489 /** Tcl to Python **/
492 Tkapp_GetInt (self
, args
)
499 if (!PyArg_Parse (args
, "s", &s
))
501 if (Tcl_GetInt (Tkapp_Interp (self
), s
, &v
) == TCL_ERROR
)
502 return Tkinter_Error (self
);
503 return Py_BuildValue ("i", v
);
507 Tkapp_GetDouble (self
, args
)
514 if (!PyArg_Parse (args
, "s", &s
))
516 if (Tcl_GetDouble (Tkapp_Interp (self
), s
, &v
) == TCL_ERROR
)
517 return Tkinter_Error (self
);
518 return Py_BuildValue ("d", v
);
522 Tkapp_GetBoolean (self
, args
)
529 if (!PyArg_Parse (args
, "s", &s
))
531 if (Tcl_GetBoolean (Tkapp_Interp (self
), s
, &v
) == TCL_ERROR
)
532 return Tkinter_Error (self
);
533 return Py_BuildValue ("i", v
);
537 Tkapp_ExprString (self
, args
)
543 if (!PyArg_Parse (args
, "s", &s
))
545 if (Tcl_ExprString (Tkapp_Interp (self
), s
) == TCL_ERROR
)
546 return Tkinter_Error (self
);
547 return Py_BuildValue ("s", Tkapp_Result (self
));
551 Tkapp_ExprLong (self
, args
)
558 if (!PyArg_Parse (args
, "s", &s
))
560 if (Tcl_ExprLong (Tkapp_Interp (self
), s
, &v
) == TCL_ERROR
)
561 return Tkinter_Error (self
);
562 return Py_BuildValue ("l", v
);
566 Tkapp_ExprDouble (self
, args
)
573 if (!PyArg_Parse (args
, "s", &s
))
575 if (Tcl_ExprDouble (Tkapp_Interp (self
), s
, &v
) == TCL_ERROR
)
576 return Tkinter_Error (self
);
577 return Py_BuildValue ("d", v
);
581 Tkapp_ExprBoolean (self
, args
)
588 if (!PyArg_Parse (args
, "s", &s
))
590 if (Tcl_ExprBoolean (Tkapp_Interp (self
), s
, &v
) == TCL_ERROR
)
591 return Tkinter_Error (self
);
592 return Py_BuildValue ("i", v
);
596 Tkapp_SplitList (self
, args
)
606 if (!PyArg_Parse (args
, "s", &list
))
609 if (Tcl_SplitList (Tkapp_Interp (self
), list
, &argc
, &argv
) == TCL_ERROR
)
610 return Tkinter_Error (self
);
612 v
= PyTuple_New (argc
);
613 for (i
= 0; i
< argc
; i
++)
614 PyTuple_SetItem (v
, i
, PyString_FromString (argv
[i
]));
621 Tkapp_Split (self
, args
)
627 if (!PyArg_Parse (args
, "s", &list
))
629 return Split (self
, list
);
633 Tkapp_Merge (self
, args
)
641 v
= PyString_FromString (s
);
648 /* This is the Tcl command that acts as a wrapper for Python
649 function or method. */
651 PythonCmd (clientData
, interp
, argc
, argv
)
652 ClientData clientData
; /* Is (self, func) */
657 PyObject
*self
, *func
, *arg
, *res
, *tmp
;
660 self
= PyTuple_GetItem ((PyObject
*) clientData
, 0);
661 func
= PyTuple_GetItem ((PyObject
*) clientData
, 1);
663 /* Create argument list (argv1, ..., argvN) */
664 arg
= PyTuple_New (argc
- 1);
665 for (i
= 0; i
< (argc
- 1); i
++)
666 PyTuple_SetItem (arg
, i
, PyString_FromString (argv
[i
+ 1]));
668 res
= PyEval_CallObject (func
, arg
);
672 return PythonCmd_Error (interp
);
674 tmp
= PyList_New (0);
675 Tcl_SetResult (Tkapp_Interp (self
), AsString (res
, tmp
), TCL_VOLATILE
);
683 PythonCmdDelete (clientData
)
684 ClientData clientData
; /* Is (self, func) */
686 Py_DECREF ((PyObject
*) clientData
);
690 Tkapp_CreateCommand (self
, args
)
698 /* Args is: (cmdName, func) */
699 if (!PyTuple_Check (args
)
700 || !(PyTuple_Size (args
) == 2)
701 || !PyString_Check (PyTuple_GetItem (args
, 0))
702 || !(PyMethod_Check (PyTuple_GetItem (args
, 1))
703 || PyFunction_Check (PyTuple_GetItem (args
, 1))))
705 PyErr_SetString (PyExc_TypeError
, "bad argument list");
709 cmdName
= PyString_AsString (PyTuple_GetItem (args
, 0));
710 func
= PyTuple_GetItem (args
, 1);
712 data
= PyTuple_New (2); /* ClientData is: (self, func) */
715 PyTuple_SetItem (data
, 0, self
);
718 PyTuple_SetItem (data
, 1, func
);
720 Tcl_CreateCommand (Tkapp_Interp (self
), cmdName
, PythonCmd
,
721 (ClientData
) data
, PythonCmdDelete
);
728 Tkapp_DeleteCommand (self
, args
)
734 if (!PyArg_Parse (args
, "s", &cmdName
))
736 if (Tcl_DeleteCommand (Tkapp_Interp (self
), cmdName
) == -1)
738 PyErr_SetString (Tkinter_TclError
, "can't delete Tcl command");
748 FileHandler (clientData
, mask
)
749 ClientData clientData
; /* Is: (func, file) */
752 PyObject
*func
, *file
, *arg
, *res
;
754 func
= PyTuple_GetItem ((PyObject
*) clientData
, 0);
755 file
= PyTuple_GetItem ((PyObject
*) clientData
, 1);
757 arg
= Py_BuildValue ("(Oi)", file
, (long) mask
);
758 res
= PyEval_CallObject (func
, arg
);
763 PyErr_Fetch (&excInCmd
, &valInCmd
, &trbInCmd
);
770 PyObject
*file
; /* Either an int >= 0 or an object with a
771 .fileno() method that returns an int >= 0 */
773 PyObject
*meth
, *args
, *res
;
775 if (PyInt_Check(file
)) {
776 id
= PyInt_AsLong(file
);
778 PyErr_SetString(PyExc_ValueError
, "invalid file id");
781 meth
= PyObject_GetAttrString(file
, "fileno");
784 args
= PyTuple_New(0);
787 res
= PyEval_CallObject(meth
, args
);
792 if (PyInt_Check(res
))
793 id
= PyInt_AsLong(res
);
797 PyErr_SetString(PyExc_ValueError
,
798 "invalid fileno() return value");
804 Tkapp_CreateFileHandler (self
, args
)
806 PyObject
*args
; /* Is (file, mask, func) */
808 PyObject
*file
, *func
, *data
;
811 if (!PyArg_Parse (args
, "(OiO)", &file
, &mask
, &func
))
813 id
= GetFileNo (file
);
816 if (!(PyMethod_Check(func
) || PyFunction_Check(func
)))
818 PyErr_SetString (PyExc_TypeError
, "bad argument list");
822 /* ClientData is: (func, file) */
823 data
= Py_BuildValue ("(OO)", func
, file
);
825 Tk_CreateFileHandler (id
, mask
, FileHandler
, (ClientData
) data
);
826 /* XXX fileHandlerDict */
833 Tkapp_DeleteFileHandler (self
, args
)
835 PyObject
*args
; /* Args: file */
840 if (!PyArg_Parse (args
, "O", &file
))
842 id
= GetFileNo (file
);
846 Tk_DeleteFileHandler (id
);
847 /* XXX fileHandlerDict */
852 /**** Tktt Object (timer token) ****/
854 staticforward PyTypeObject Tktt_Type
;
865 Tktt_DeleteTimerHandler (self
, args
)
869 TkttObject
*v
= (TkttObject
*) self
;
871 if (!PyArg_Parse (args
, ""))
875 Tk_DeleteTimerHandler (v
->token
);
883 static PyMethodDef Tktt_methods
[] =
885 {"deletetimerhandler", Tktt_DeleteTimerHandler
},
890 Tktt_New (token
, func
)
896 v
= PyObject_NEW (TkttObject
, &Tktt_Type
);
914 Tktt_Print (self
, fp
, flags
)
919 TkttObject
*v
= (TkttObject
*) self
;
921 fprintf(fp
, "<tktimertoken at 0x%x%s>", v
,
922 v
->func
== NULL
? ", handler deleted" : "");
927 Tktt_GetAttr (self
, name
)
931 return Py_FindMethod (Tktt_methods
, self
, name
);
934 static PyTypeObject Tktt_Type
=
936 PyObject_HEAD_INIT (&PyType_Type
)
938 "tktimertoken", /*tp_name */
939 sizeof (TkttObject
), /*tp_basicsize */
941 Tktt_Dealloc
, /*tp_dealloc */
942 Tktt_Print
, /*tp_print */
943 Tktt_GetAttr
, /*tp_getattr */
948 0, /*tp_as_sequence */
949 0, /*tp_as_mapping */
953 /** Timer Handler **/
956 TimerHandler (clientData
)
957 ClientData clientData
;
959 PyObject
*func
= (PyObject
*) clientData
;
962 arg
= PyTuple_New (0);
963 res
= PyEval_CallObject (func
, arg
);
968 PyErr_Fetch (&excInCmd
, &valInCmd
, &trbInCmd
);
975 Tkapp_CreateTimerHandler (self
, args
)
977 PyObject
*args
; /* Is (milliseconds, func) */
983 if (!PyArg_Parse (args
, "(iO)", &milliseconds
, &func
))
985 if (!(PyMethod_Check(func
) || PyFunction_Check(func
) ||
986 PyCFunction_Check(func
)))
988 PyErr_SetString (PyExc_TypeError
, "bad argument list");
991 token
= Tk_CreateTimerHandler(milliseconds
, TimerHandler
, (ClientData
) func
);
992 return (PyObject
*) Tktt_New (token
, func
);
998 Tkapp_MainLoop (self
, args
)
1004 if (!PyArg_Parse (args
, ""))
1007 if (!PyArg_Parse (args
, "i", &threshold
))
1012 while (tk_NumMainWindows
> threshold
&& !quitMainLoop
&& !errorInCmd
)
1014 if (PyOS_InterruptOccurred ())
1016 PyErr_SetNone (PyExc_KeyboardInterrupt
);
1025 PyErr_Restore (excInCmd
, valInCmd
, trbInCmd
);
1026 excInCmd
= valInCmd
= trbInCmd
= NULL
;
1029 Py_INCREF (Py_None
);
1034 Tkapp_DoOneEvent (self
, args
)
1041 if (PyArg_Parse (args
, ""))
1042 flags
= TK_ALL_EVENTS
;
1046 if (!PyArg_Parse (args
, "i", &flags
))
1049 rv
= Tk_DoOneEvent(flags
);
1050 return Py_BuildValue ("i", rv
);
1054 Tkapp_Quit (self
, args
)
1059 if (!PyArg_Parse (args
, ""))
1062 Py_INCREF (Py_None
);
1066 /**** Tkapp Method List ****/
1068 static PyMethodDef Tkapp_methods
[] =
1070 {"call", Tkapp_Call
},
1071 {"globalcall", Tkapp_GlobalCall
},
1072 {"eval", Tkapp_Eval
},
1073 {"globaleval", Tkapp_GlobalEval
},
1074 {"evalfile", Tkapp_EvalFile
},
1075 {"record", Tkapp_Record
},
1076 {"adderrorinfo", Tkapp_AddErrorInfo
},
1077 {"setvar", Tkapp_SetVar
},
1078 {"globalsetvar", Tkapp_GlobalSetVar
},
1079 {"getvar", Tkapp_GetVar
},
1080 {"globalgetvar", Tkapp_GlobalGetVar
},
1081 {"unsetvar", Tkapp_UnsetVar
},
1082 {"globalunsetvar", Tkapp_GlobalUnsetVar
},
1083 {"getint", Tkapp_GetInt
},
1084 {"getdouble", Tkapp_GetDouble
},
1085 {"getboolean", Tkapp_GetBoolean
},
1086 {"exprstring", Tkapp_ExprString
},
1087 {"exprlong", Tkapp_ExprLong
},
1088 {"exprdouble", Tkapp_ExprDouble
},
1089 {"exprboolean", Tkapp_ExprBoolean
},
1090 {"splitlist", Tkapp_SplitList
},
1091 {"split", Tkapp_Split
},
1092 {"merge", Tkapp_Merge
},
1093 {"createcommand", Tkapp_CreateCommand
},
1094 {"deletecommand", Tkapp_DeleteCommand
},
1095 {"createfilehandler", Tkapp_CreateFileHandler
},
1096 {"deletefilehandler", Tkapp_DeleteFileHandler
},
1097 {"createtimerhandler", Tkapp_CreateTimerHandler
},
1098 {"mainloop", Tkapp_MainLoop
},
1099 {"dooneevent", Tkapp_DoOneEvent
},
1100 {"quit", Tkapp_Quit
},
1104 /**** Tkapp Type Methods ****/
1107 Tkapp_Dealloc (self
)
1110 Tk_DestroyWindow (Tkapp_Tkwin (self
));
1111 Tcl_DeleteInterp (Tkapp_Interp (self
));
1116 Tkapp_GetAttr (self
, name
)
1120 return Py_FindMethod (Tkapp_methods
, self
, name
);
1123 static PyTypeObject Tkapp_Type
=
1125 PyObject_HEAD_INIT (&PyType_Type
)
1127 "tkapp", /*tp_name */
1128 sizeof (TkappObject
), /*tp_basicsize */
1130 Tkapp_Dealloc
, /*tp_dealloc */
1132 Tkapp_GetAttr
, /*tp_getattr */
1136 0, /*tp_as_number */
1137 0, /*tp_as_sequence */
1138 0, /*tp_as_mapping */
1142 /**** Tkinter Module ****/
1145 Tkinter_Create (self
, args
)
1149 char *screenName
= NULL
;
1152 int interactive
= 0;
1154 baseName
= strrchr (getprogramname (), '/');
1155 if (baseName
!= NULL
)
1158 baseName
= getprogramname ();
1161 if (PyArg_Parse (args
, ""))
1163 else if (PyArg_Parse (args
, "z",
1166 else if (PyArg_Parse (args
, "(zs)",
1167 &screenName
, &baseName
))
1169 else if (PyArg_Parse (args
, "(zss)",
1170 &screenName
, &baseName
, &className
))
1172 else if (PyArg_Parse (args
, "(zssi)",
1173 &screenName
, &baseName
, &className
, &interactive
))
1178 return (PyObject
*) Tkapp_New (screenName
, baseName
, className
,
1182 static PyMethodDef moduleMethods
[] =
1184 {"create", Tkinter_Create
},
1185 {"createfilehandler", Tkapp_CreateFileHandler
},
1186 {"deletefilehandler", Tkapp_DeleteFileHandler
},
1187 {"createtimerhandler", Tkapp_CreateTimerHandler
},
1188 {"mainloop", Tkapp_MainLoop
},
1189 {"dooneevent", Tkapp_DoOneEvent
},
1190 {"quit", Tkapp_Quit
},
1194 #ifdef WITH_READLINE
1198 if (errorInCmd
) /* XXX Reset tty */
1201 PyErr_Restore (excInCmd
, valInCmd
, trbInCmd
);
1202 excInCmd
= valInCmd
= trbInCmd
= NULL
;
1205 if (tk_NumMainWindows
> 0)
1206 Tk_DoOneEvent (TK_DONT_WAIT
);
1209 #endif /* WITH_READLINE */
1214 /* XXX rl_deprep_terminal is static, damned! */
1215 while (tkMainWindowList
!= 0)
1216 Tk_DestroyWindow (tkMainWindowList
->win
);
1224 #ifdef WITH_READLINE
1225 extern int (*rl_event_hook
) ();
1226 #endif /* WITH_READLINE */
1227 PyObject
*m
, *d
, *v
;
1229 m
= Py_InitModule ("tkinter", moduleMethods
);
1231 d
= PyModule_GetDict (m
);
1232 Tkinter_TclError
= Py_BuildValue ("s", "TclError");
1233 PyDict_SetItemString (d
, "TclError", Tkinter_TclError
);
1235 v
= Py_BuildValue ("i", TK_READABLE
);
1236 PyDict_SetItemString (d
, "READABLE", v
);
1237 v
= Py_BuildValue ("i", TK_WRITABLE
);
1238 PyDict_SetItemString (d
, "WRITABLE", v
);
1239 v
= Py_BuildValue ("i", TK_EXCEPTION
);
1240 PyDict_SetItemString (d
, "EXCEPTION", v
);
1241 v
= Py_BuildValue ("i", TK_X_EVENTS
);
1242 PyDict_SetItemString (d
, "X_EVENTS", v
);
1243 v
= Py_BuildValue ("i", TK_FILE_EVENTS
);
1244 PyDict_SetItemString (d
, "FILE_EVENTS", v
);
1245 v
= Py_BuildValue ("i", TK_TIMER_EVENTS
);
1246 PyDict_SetItemString (d
, "TIMER_EVENTS", v
);
1247 v
= Py_BuildValue ("i", TK_IDLE_EVENTS
);
1248 PyDict_SetItemString (d
, "IDLE_EVENTS", v
);
1249 v
= Py_BuildValue ("i", TK_ALL_EVENTS
);
1250 PyDict_SetItemString (d
, "ALL_EVENTS", v
);
1251 v
= Py_BuildValue ("i", TK_DONT_WAIT
);
1252 PyDict_SetItemString (d
, "DONT_WAIT", v
);
1254 #ifdef WITH_READLINE
1255 rl_event_hook
= EventHook
;
1256 #endif /* WITH_READLINE */
1261 if (Py_AtExit (Tkinter_Cleanup
) != 0)
1263 "Tkinter: warning: cleanup procedure not registered\n");
1266 if (PyErr_Occurred ())
1267 Py_FatalError ("can't initialize module tkinter");