mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Functionality enhancement: allow other threads to use Tk commands
while one thread is blocked in mainloop(). Also, handle signals (not just interrupts) as soon as they happen. Cleanup: remove support for Tcl/Tk versions 7.4/4.0. (I've confirmed that it works for 7.5/4.1 and 7.6/4.2, as well as 8.0b2.) Coding style change: instead of ``func (args)'', write ``func(args)'' everywhere. Minor functionality change: use PyArg_ParseTuple everywhere. This should only affect the errors reported for bad argument lists; in particular, deletefilehandler() is much clearer about what's going on. (XXX Still to do: Mac and Win ports to 8.0b2.)
This commit is contained in:
parent
3e819a7aa8
commit
35d43377b4
1 changed files with 213 additions and 245 deletions
|
@ -36,8 +36,8 @@ PERFORMANCE OF THIS SOFTWARE.
|
|||
|
||||
Unix:
|
||||
Tcl/Tk 8.0 (even alpha or beta) or 7.6/4.2 are recommended.
|
||||
This should work with any version from 7.4/4.0 upwards.
|
||||
Tk 3.x is no longer supported.
|
||||
Versions 7.5/4.1 are the earliest versions still supported.
|
||||
Versions 7.4/4.0 or Tk 3.x are no longer supported.
|
||||
|
||||
Mac and Windows:
|
||||
Use Tcl 8.0 if available (even alpha or beta).
|
||||
|
@ -45,6 +45,7 @@ PERFORMANCE OF THIS SOFTWARE.
|
|||
|
||||
*/
|
||||
|
||||
|
||||
#include "Python.h"
|
||||
#include <ctype.h>
|
||||
|
||||
|
@ -56,23 +57,14 @@ PERFORMANCE OF THIS SOFTWARE.
|
|||
#include <tcl.h>
|
||||
#include <tk.h>
|
||||
|
||||
#if TK_MAJOR_VERSION < 4
|
||||
#error "Tk 3.x is not supported"
|
||||
#endif
|
||||
|
||||
#define TKMAJORMINOR (TK_MAJOR_VERSION*1000 + TK_MINOR_VERSION)
|
||||
|
||||
extern char *Py_GetProgramName ();
|
||||
|
||||
#if TKMAJORMINOR >= 4001
|
||||
extern int Tk_GetNumMainWindows();
|
||||
#else
|
||||
/* Internal declarations from tkInt.h. */
|
||||
extern int tk_NumMainWindows;
|
||||
#define Tk_GetNumMainWindows() (tk_NumMainWindows)
|
||||
#define NEED_TKCREATEMAINWINDOW 1
|
||||
#if TKMAJORMINOR < 4001
|
||||
#error "Tk 4.0 or 3.x are not supported -- use 4.1 or higher"
|
||||
#endif
|
||||
|
||||
extern int Tk_GetNumMainWindows();
|
||||
|
||||
#ifdef macintosh
|
||||
|
||||
/*
|
||||
|
@ -105,16 +97,10 @@ typedef struct
|
|||
{
|
||||
PyObject_HEAD
|
||||
Tcl_Interp *interp;
|
||||
#ifdef NEED_TKCREATEMAINWINDOW
|
||||
Tk_Window tkwin;
|
||||
#endif
|
||||
}
|
||||
TkappObject;
|
||||
|
||||
#define Tkapp_Check(v) ((v)->ob_type == &Tkapp_Type)
|
||||
#ifdef NEED_TKCREATEMAINWINDOW
|
||||
#define Tkapp_Tkwin(v) (((TkappObject *) (v))->tkwin)
|
||||
#endif
|
||||
#define Tkapp_Interp(v) (((TkappObject *) (v))->interp)
|
||||
#define Tkapp_Result(v) (((TkappObject *) (v))->interp->result)
|
||||
|
||||
|
@ -338,15 +324,6 @@ Tkapp_New(screenName, baseName, className, interactive)
|
|||
|
||||
v->interp = Tcl_CreateInterp();
|
||||
|
||||
#ifdef NEED_TKCREATEMAINWINDOW
|
||||
v->tkwin = Tk_CreateMainWindow(v->interp, screenName,
|
||||
baseName, className);
|
||||
if (v->tkwin == NULL)
|
||||
return (TkappObject *)Tkinter_Error((PyObject *) v);
|
||||
|
||||
Tk_GeometryRequest(v->tkwin, 200, 200);
|
||||
#endif
|
||||
|
||||
if (screenName != NULL)
|
||||
Tcl_SetVar2(v->interp, "env", "DISPLAY",
|
||||
screenName, TCL_GLOBAL_ONLY);
|
||||
|
@ -434,7 +411,7 @@ Tkapp_Eval(self, args)
|
|||
{
|
||||
char *script;
|
||||
|
||||
if (!PyArg_Parse (args, "s", &script))
|
||||
if (!PyArg_ParseTuple(args, "s", &script))
|
||||
return NULL;
|
||||
|
||||
if (Tcl_Eval(Tkapp_Interp(self), script) == TCL_ERROR)
|
||||
|
@ -450,7 +427,7 @@ Tkapp_GlobalEval(self, args)
|
|||
{
|
||||
char *script;
|
||||
|
||||
if (!PyArg_Parse(args, "s", &script))
|
||||
if (!PyArg_ParseTuple(args, "s", &script))
|
||||
return NULL;
|
||||
|
||||
if (Tcl_GlobalEval(Tkapp_Interp(self), script) == TCL_ERROR)
|
||||
|
@ -466,7 +443,7 @@ Tkapp_EvalFile (self, args)
|
|||
{
|
||||
char *fileName;
|
||||
|
||||
if (!PyArg_Parse(args, "s", &fileName))
|
||||
if (!PyArg_ParseTuple(args, "s", &fileName))
|
||||
return NULL;
|
||||
|
||||
if (Tcl_EvalFile(Tkapp_Interp(self), fileName) == TCL_ERROR)
|
||||
|
@ -482,7 +459,7 @@ Tkapp_Record(self, args)
|
|||
{
|
||||
char *script;
|
||||
|
||||
if (!PyArg_Parse(args, "s", &script))
|
||||
if (!PyArg_ParseTuple(args, "s", &script))
|
||||
return NULL;
|
||||
|
||||
if (TCL_ERROR == Tcl_RecordAndEval(Tkapp_Interp(self),
|
||||
|
@ -499,7 +476,7 @@ Tkapp_AddErrorInfo(self, args)
|
|||
{
|
||||
char *msg;
|
||||
|
||||
if (!PyArg_Parse (args, "s", &msg))
|
||||
if (!PyArg_ParseTuple(args, "s", &msg))
|
||||
return NULL;
|
||||
Tcl_AddErrorInfo(Tkapp_Interp(self), msg);
|
||||
|
||||
|
@ -524,18 +501,21 @@ SetVar(self, args, flags)
|
|||
if (!tmp)
|
||||
return NULL;
|
||||
|
||||
if (PyArg_Parse(args, "(sO)", &name1, &newValue))
|
||||
if (PyArg_ParseTuple(args, "sO", &name1, &newValue))
|
||||
/* XXX Merge? */
|
||||
ok = Tcl_SetVar(Tkapp_Interp(self), name1,
|
||||
AsString(newValue, tmp), flags);
|
||||
|
||||
else if (PyArg_Parse(args, "(ssO)", &name1, &name2, &newValue))
|
||||
else {
|
||||
PyErr_Clear();
|
||||
if (PyArg_ParseTuple(args, "ssO", &name1, &name2, &newValue))
|
||||
ok = Tcl_SetVar2(Tkapp_Interp(self), name1, name2,
|
||||
AsString (newValue, tmp), flags);
|
||||
else {
|
||||
Py_DECREF (tmp);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
Py_DECREF(tmp);
|
||||
|
||||
if (!ok)
|
||||
|
@ -569,15 +549,15 @@ GetVar (self, args, flags)
|
|||
PyObject *args;
|
||||
int flags;
|
||||
{
|
||||
char *name1, *name2, *s;
|
||||
char *name1, *name2=NULL, *s;
|
||||
|
||||
if (PyArg_Parse(args, "s", &name1))
|
||||
if (!PyArg_ParseTuple(args, "s|s", &name1, &name2))
|
||||
return NULL;
|
||||
if (name2 == NULL)
|
||||
s = Tcl_GetVar(Tkapp_Interp (self), name1, flags);
|
||||
|
||||
else if (PyArg_Parse(args, "(ss)", &name1, &name2))
|
||||
s = Tcl_GetVar2(Tkapp_Interp(self), name1, name2, flags);
|
||||
else
|
||||
return NULL;
|
||||
s = Tcl_GetVar2(Tkapp_Interp(self), name1, name2, flags);
|
||||
|
||||
if (s == NULL)
|
||||
return Tkinter_Error(self);
|
||||
|
@ -609,16 +589,16 @@ UnsetVar (self, args, flags)
|
|||
PyObject *args;
|
||||
int flags;
|
||||
{
|
||||
char *name1, *name2;
|
||||
char *name1, *name2=NULL;
|
||||
int code;
|
||||
|
||||
if (PyArg_Parse(args, "s", &name1))
|
||||
if (!PyArg_ParseTuple(args, "s|s", &name1, &name2))
|
||||
return NULL;
|
||||
if (name2 == NULL)
|
||||
code = Tcl_UnsetVar(Tkapp_Interp(self), name1, flags);
|
||||
|
||||
else if (PyArg_Parse(args, "(ss)", &name1, &name2))
|
||||
code = Tcl_UnsetVar2(Tkapp_Interp(self), name1, name2, flags);
|
||||
else
|
||||
return NULL;
|
||||
code = Tcl_UnsetVar2(Tkapp_Interp(self), name1, name2, flags);
|
||||
|
||||
if (code == TCL_ERROR)
|
||||
return Tkinter_Error(self);
|
||||
|
@ -655,7 +635,7 @@ Tkapp_GetInt (self, args)
|
|||
char *s;
|
||||
int v;
|
||||
|
||||
if (!PyArg_Parse(args, "s", &s))
|
||||
if (!PyArg_ParseTuple(args, "s", &s))
|
||||
return NULL;
|
||||
if (Tcl_GetInt(Tkapp_Interp(self), s, &v) == TCL_ERROR)
|
||||
return Tkinter_Error(self);
|
||||
|
@ -670,7 +650,7 @@ Tkapp_GetDouble (self, args)
|
|||
char *s;
|
||||
double v;
|
||||
|
||||
if (!PyArg_Parse(args, "s", &s))
|
||||
if (!PyArg_ParseTuple(args, "s", &s))
|
||||
return NULL;
|
||||
if (Tcl_GetDouble(Tkapp_Interp(self), s, &v) == TCL_ERROR)
|
||||
return Tkinter_Error(self);
|
||||
|
@ -685,7 +665,7 @@ Tkapp_GetBoolean (self, args)
|
|||
char *s;
|
||||
int v;
|
||||
|
||||
if (!PyArg_Parse(args, "s", &s))
|
||||
if (!PyArg_ParseTuple(args, "s", &s))
|
||||
return NULL;
|
||||
if (Tcl_GetBoolean(Tkapp_Interp(self), s, &v) == TCL_ERROR)
|
||||
return Tkinter_Error(self);
|
||||
|
@ -699,7 +679,7 @@ Tkapp_ExprString (self, args)
|
|||
{
|
||||
char *s;
|
||||
|
||||
if (!PyArg_Parse(args, "s", &s))
|
||||
if (!PyArg_ParseTuple(args, "s", &s))
|
||||
return NULL;
|
||||
if (Tcl_ExprString(Tkapp_Interp(self), s) == TCL_ERROR)
|
||||
return Tkinter_Error(self);
|
||||
|
@ -714,7 +694,7 @@ Tkapp_ExprLong (self, args)
|
|||
char *s;
|
||||
long v;
|
||||
|
||||
if (!PyArg_Parse(args, "s", &s))
|
||||
if (!PyArg_ParseTuple(args, "s", &s))
|
||||
return NULL;
|
||||
if (Tcl_ExprLong(Tkapp_Interp(self), s, &v) == TCL_ERROR)
|
||||
return Tkinter_Error(self);
|
||||
|
@ -730,7 +710,7 @@ Tkapp_ExprDouble (self, args)
|
|||
double v;
|
||||
int retval;
|
||||
|
||||
if (!PyArg_Parse(args, "s", &s))
|
||||
if (!PyArg_ParseTuple(args, "s", &s))
|
||||
return NULL;
|
||||
PyFPE_START_PROTECT("Tkapp_ExprDouble", return 0)
|
||||
retval = Tcl_ExprDouble(Tkapp_Interp(self), s, &v);
|
||||
|
@ -748,7 +728,7 @@ Tkapp_ExprBoolean (self, args)
|
|||
char *s;
|
||||
int v;
|
||||
|
||||
if (!PyArg_Parse(args, "s", &s))
|
||||
if (!PyArg_ParseTuple(args, "s", &s))
|
||||
return NULL;
|
||||
if (Tcl_ExprBoolean(Tkapp_Interp(self), s, &v) == TCL_ERROR)
|
||||
return Tkinter_Error(self);
|
||||
|
@ -768,7 +748,7 @@ Tkapp_SplitList (self, args)
|
|||
PyObject *v;
|
||||
int i;
|
||||
|
||||
if (!PyArg_Parse(args, "s", &list))
|
||||
if (!PyArg_ParseTuple(args, "s", &list))
|
||||
return NULL;
|
||||
|
||||
if (Tcl_SplitList(Tkapp_Interp(self), list, &argc, &argv) == TCL_ERROR)
|
||||
|
@ -798,7 +778,7 @@ Tkapp_Split (self, args)
|
|||
{
|
||||
char *list;
|
||||
|
||||
if (!PyArg_Parse(args, "s", &list))
|
||||
if (!PyArg_ParseTuple(args, "s", &list))
|
||||
return NULL;
|
||||
return Split(self, list);
|
||||
}
|
||||
|
@ -888,34 +868,27 @@ Tkapp_CreateCommand (self, args)
|
|||
PyObject *args;
|
||||
{
|
||||
char *cmdName;
|
||||
PyObject *data;
|
||||
PyObject *func;
|
||||
PyObject *data;
|
||||
|
||||
/* Args is: (cmdName, func) */
|
||||
if (!PyTuple_Check(args)
|
||||
|| !(PyTuple_Size(args) == 2)
|
||||
|| !PyString_Check(PyTuple_GetItem(args, 0))
|
||||
|| !PyCallable_Check(PyTuple_GetItem(args, 1)))
|
||||
{
|
||||
PyErr_SetString (PyExc_TypeError, "bad argument list");
|
||||
if (!PyArg_ParseTuple(args, "sO", &cmdName, &func))
|
||||
return NULL;
|
||||
if (!PyCallable_Check(func)) {
|
||||
PyErr_SetString(PyExc_TypeError, "command not callable");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cmdName = PyString_AsString(PyTuple_GetItem(args, 0));
|
||||
func = PyTuple_GetItem(args, 1);
|
||||
|
||||
data = PyTuple_New(2); /* ClientData is: (self, func) */
|
||||
data = Py_BuildValue("OO", self, func);
|
||||
if (!data)
|
||||
return NULL;
|
||||
|
||||
Py_INCREF(self);
|
||||
PyTuple_SetItem(data, 0, self);
|
||||
|
||||
Py_INCREF(func);
|
||||
PyTuple_SetItem(data, 1, func);
|
||||
|
||||
Tcl_CreateCommand(Tkapp_Interp (self), cmdName, PythonCmd,
|
||||
(ClientData) data, PythonCmdDelete);
|
||||
if (Tcl_CreateCommand(Tkapp_Interp(self), cmdName, PythonCmd,
|
||||
(ClientData) data, PythonCmdDelete) == NULL)
|
||||
{
|
||||
PyErr_SetString(Tkinter_TclError, "can't create Tcl command");
|
||||
Py_DECREF(data);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Py_INCREF(Py_None);
|
||||
return Py_None;
|
||||
|
@ -930,7 +903,7 @@ Tkapp_DeleteCommand (self, args)
|
|||
{
|
||||
char *cmdName;
|
||||
|
||||
if (!PyArg_Parse(args, "s", &cmdName))
|
||||
if (!PyArg_ParseTuple(args, "s", &cmdName))
|
||||
return NULL;
|
||||
if (Tcl_DeleteCommand(Tkapp_Interp(self), cmdName) == -1)
|
||||
{
|
||||
|
@ -1021,9 +994,7 @@ Tkapp_CreateFileHandler (self, args)
|
|||
PyObject *idkey;
|
||||
int mask, id;
|
||||
#if TKMAJORMINOR < 8000
|
||||
#if TKMAJORMINOR >= 4001
|
||||
Tcl_File tfile;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
if (!Tkapp_ClientDataDict) {
|
||||
|
@ -1031,7 +1002,7 @@ Tkapp_CreateFileHandler (self, args)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
if (!PyArg_Parse(args, "(OiO)", &file, &mask, &func))
|
||||
if (!PyArg_ParseTuple(args, "OiO", &file, &mask, &func))
|
||||
return NULL;
|
||||
id = GetFileNo(file);
|
||||
if (id < 0)
|
||||
|
@ -1054,7 +1025,6 @@ Tkapp_CreateFileHandler (self, args)
|
|||
Py_DECREF(idkey);
|
||||
|
||||
#if TKMAJORMINOR < 8000
|
||||
#if TKMAJORMINOR >= 4001
|
||||
#ifdef MS_WINDOWS
|
||||
/* We assume this is a socket... */
|
||||
tfile = Tcl_GetFile((ClientData)id, TCL_WIN_SOCKET);
|
||||
|
@ -1063,12 +1033,9 @@ Tkapp_CreateFileHandler (self, args)
|
|||
#endif /* !MS_WINDOWS */
|
||||
/* Ought to check for null Tcl_File object... */
|
||||
Tcl_CreateFileHandler(tfile, mask, FileHandler, (ClientData) data);
|
||||
#else /* ! >= 4001 */
|
||||
Tk_CreateFileHandler(id, mask, FileHandler, (ClientData) data);
|
||||
#endif /* ! >= 4001 */
|
||||
#else /* ! < 8000 */
|
||||
#else /* >= 8000 */
|
||||
Tcl_CreateFileHandler(id, mask, FileHandler, (ClientData) data);
|
||||
#endif /* < 8000 */
|
||||
#endif /* >= 8000 */
|
||||
/* XXX fileHandlerDict */
|
||||
Py_INCREF(Py_None);
|
||||
return Py_None;
|
||||
|
@ -1085,12 +1052,10 @@ Tkapp_DeleteFileHandler (self, args)
|
|||
PyObject *data;
|
||||
int id;
|
||||
#if TKMAJORMINOR < 8000
|
||||
#if TKMAJORMINOR >= 4001
|
||||
Tcl_File tfile;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
if (!PyArg_Parse(args, "O", &file))
|
||||
if (!PyArg_ParseTuple(args, "O", &file))
|
||||
return NULL;
|
||||
id = GetFileNo(file);
|
||||
if (id < 0)
|
||||
|
@ -1108,7 +1073,6 @@ Tkapp_DeleteFileHandler (self, args)
|
|||
Py_DECREF(idkey);
|
||||
|
||||
#if TKMAJORMINOR < 8000
|
||||
#if TKMAJORMINOR >= 4001
|
||||
#ifdef MS_WINDOWS
|
||||
/* We assume this is a socket... */
|
||||
tfile = Tcl_GetFile((ClientData)id, TCL_WIN_SOCKET);
|
||||
|
@ -1117,12 +1081,9 @@ Tkapp_DeleteFileHandler (self, args)
|
|||
#endif
|
||||
/* Ought to check for null Tcl_File object... */
|
||||
Tcl_DeleteFileHandler(tfile);
|
||||
#else
|
||||
Tk_DeleteFileHandler(id);
|
||||
#endif
|
||||
#else
|
||||
#else /* >= 8000 */
|
||||
Tcl_DeleteFileHandler(id);
|
||||
#endif
|
||||
#endif /* >= 8000 */
|
||||
/* XXX fileHandlerDict */
|
||||
Py_INCREF(Py_None);
|
||||
return Py_None;
|
||||
|
@ -1136,7 +1097,7 @@ staticforward PyTypeObject Tktt_Type;
|
|||
typedef struct
|
||||
{
|
||||
PyObject_HEAD
|
||||
Tk_TimerToken token;
|
||||
Tcl_TimerToken token;
|
||||
PyObject *func;
|
||||
}
|
||||
TkttObject;
|
||||
|
@ -1148,10 +1109,10 @@ Tktt_DeleteTimerHandler (self, args)
|
|||
{
|
||||
TkttObject *v = (TkttObject *)self;
|
||||
|
||||
if (!PyArg_Parse(args, ""))
|
||||
if (!PyArg_ParseTuple(args, ""))
|
||||
return NULL;
|
||||
if (v->func != NULL) {
|
||||
Tk_DeleteTimerHandler(v->token);
|
||||
Tcl_DeleteTimerHandler(v->token);
|
||||
PyMem_DEL(v->func);
|
||||
v->func = NULL;
|
||||
}
|
||||
|
@ -1161,13 +1122,13 @@ Tktt_DeleteTimerHandler (self, args)
|
|||
|
||||
static PyMethodDef Tktt_methods[] =
|
||||
{
|
||||
{"deletetimerhandler", Tktt_DeleteTimerHandler},
|
||||
{"deletetimerhandler", Tktt_DeleteTimerHandler, 1},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
static TkttObject *
|
||||
Tktt_New(token, func)
|
||||
Tk_TimerToken token;
|
||||
Tcl_TimerToken token;
|
||||
PyObject *func;
|
||||
{
|
||||
TkttObject *v;
|
||||
|
@ -1255,15 +1216,15 @@ Tkapp_CreateTimerHandler (self, args)
|
|||
{
|
||||
int milliseconds;
|
||||
PyObject *func;
|
||||
Tk_TimerToken token;
|
||||
Tcl_TimerToken token;
|
||||
|
||||
if (!PyArg_Parse(args, "(iO)", &milliseconds, &func))
|
||||
if (!PyArg_ParseTuple(args, "iO", &milliseconds, &func))
|
||||
return NULL;
|
||||
if (!PyCallable_Check(func)) {
|
||||
PyErr_SetString(PyExc_TypeError, "bad argument list");
|
||||
return NULL;
|
||||
}
|
||||
token = Tk_CreateTimerHandler(milliseconds, TimerHandler,
|
||||
token = Tcl_CreateTimerHandler(milliseconds, TimerHandler,
|
||||
(ClientData)func);
|
||||
|
||||
return (PyObject *) Tktt_New(token, func);
|
||||
|
@ -1288,12 +1249,22 @@ Tkapp_MainLoop (self, args)
|
|||
!quitMainLoop &&
|
||||
!errorInCmd)
|
||||
{
|
||||
/* XXX Ought to check for other signals! */
|
||||
if (PyOS_InterruptOccurred()) {
|
||||
PyErr_SetNone(PyExc_KeyboardInterrupt);
|
||||
int result;
|
||||
result = Tcl_DoOneEvent(TCL_DONT_WAIT);
|
||||
if (PyErr_CheckSignals() != 0)
|
||||
return NULL;
|
||||
}
|
||||
Tk_DoOneEvent(0);
|
||||
if (result)
|
||||
continue;
|
||||
/* XXX It's not *quite* certain that this is
|
||||
thread-safe, but it seems *rather* safe as long as
|
||||
no two threads call mainloop() simultaneously. */
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
result = Tcl_WaitForEvent((Tcl_Time *)NULL);
|
||||
Py_END_ALLOW_THREADS
|
||||
if (PyErr_CheckSignals() != 0)
|
||||
return NULL;
|
||||
if (result < 0)
|
||||
break;
|
||||
}
|
||||
quitMainLoop = 0;
|
||||
|
||||
|
@ -1312,13 +1283,13 @@ Tkapp_DoOneEvent (self, args)
|
|||
PyObject *self;
|
||||
PyObject *args;
|
||||
{
|
||||
int flags = TK_ALL_EVENTS;
|
||||
int flags = 0;
|
||||
int rv;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "|i", &flags))
|
||||
return NULL;
|
||||
|
||||
rv = Tk_DoOneEvent(flags);
|
||||
rv = Tcl_DoOneEvent(flags);
|
||||
return Py_BuildValue("i", rv);
|
||||
}
|
||||
|
||||
|
@ -1328,7 +1299,7 @@ Tkapp_Quit (self, args)
|
|||
PyObject *args;
|
||||
{
|
||||
|
||||
if (!PyArg_Parse(args, ""))
|
||||
if (!PyArg_ParseTuple(args, ""))
|
||||
return NULL;
|
||||
|
||||
quitMainLoop = 1;
|
||||
|
@ -1342,37 +1313,37 @@ Tkapp_Quit (self, args)
|
|||
|
||||
static PyMethodDef Tkapp_methods[] =
|
||||
{
|
||||
{"call", Tkapp_Call},
|
||||
{"globalcall", Tkapp_GlobalCall},
|
||||
{"eval", Tkapp_Eval},
|
||||
{"globaleval", Tkapp_GlobalEval},
|
||||
{"evalfile", Tkapp_EvalFile},
|
||||
{"record", Tkapp_Record},
|
||||
{"adderrorinfo", Tkapp_AddErrorInfo},
|
||||
{"setvar", Tkapp_SetVar},
|
||||
{"globalsetvar", Tkapp_GlobalSetVar},
|
||||
{"getvar", Tkapp_GetVar},
|
||||
{"globalgetvar", Tkapp_GlobalGetVar},
|
||||
{"unsetvar", Tkapp_UnsetVar},
|
||||
{"globalunsetvar", Tkapp_GlobalUnsetVar},
|
||||
{"getint", Tkapp_GetInt},
|
||||
{"getdouble", Tkapp_GetDouble},
|
||||
{"getboolean", Tkapp_GetBoolean},
|
||||
{"exprstring", Tkapp_ExprString},
|
||||
{"exprlong", Tkapp_ExprLong},
|
||||
{"exprdouble", Tkapp_ExprDouble},
|
||||
{"exprboolean", Tkapp_ExprBoolean},
|
||||
{"splitlist", Tkapp_SplitList},
|
||||
{"split", Tkapp_Split},
|
||||
{"merge", Tkapp_Merge},
|
||||
{"createcommand", Tkapp_CreateCommand},
|
||||
{"deletecommand", Tkapp_DeleteCommand},
|
||||
{"createfilehandler", Tkapp_CreateFileHandler},
|
||||
{"deletefilehandler", Tkapp_DeleteFileHandler},
|
||||
{"createtimerhandler", Tkapp_CreateTimerHandler},
|
||||
{"call", Tkapp_Call, 0},
|
||||
{"globalcall", Tkapp_GlobalCall, 0},
|
||||
{"eval", Tkapp_Eval, 1},
|
||||
{"globaleval", Tkapp_GlobalEval, 1},
|
||||
{"evalfile", Tkapp_EvalFile, 1},
|
||||
{"record", Tkapp_Record, 1},
|
||||
{"adderrorinfo", Tkapp_AddErrorInfo, 1},
|
||||
{"setvar", Tkapp_SetVar, 1},
|
||||
{"globalsetvar", Tkapp_GlobalSetVar, 1},
|
||||
{"getvar", Tkapp_GetVar, 1},
|
||||
{"globalgetvar", Tkapp_GlobalGetVar, 1},
|
||||
{"unsetvar", Tkapp_UnsetVar, 1},
|
||||
{"globalunsetvar", Tkapp_GlobalUnsetVar, 1},
|
||||
{"getint", Tkapp_GetInt, 1},
|
||||
{"getdouble", Tkapp_GetDouble, 1},
|
||||
{"getboolean", Tkapp_GetBoolean, 1},
|
||||
{"exprstring", Tkapp_ExprString, 1},
|
||||
{"exprlong", Tkapp_ExprLong, 1},
|
||||
{"exprdouble", Tkapp_ExprDouble, 1},
|
||||
{"exprboolean", Tkapp_ExprBoolean, 1},
|
||||
{"splitlist", Tkapp_SplitList, 1},
|
||||
{"split", Tkapp_Split, 1},
|
||||
{"merge", Tkapp_Merge, 0},
|
||||
{"createcommand", Tkapp_CreateCommand, 1},
|
||||
{"deletecommand", Tkapp_DeleteCommand, 1},
|
||||
{"createfilehandler", Tkapp_CreateFileHandler, 1},
|
||||
{"deletefilehandler", Tkapp_DeleteFileHandler, 1},
|
||||
{"createtimerhandler", Tkapp_CreateTimerHandler, 1},
|
||||
{"mainloop", Tkapp_MainLoop, 1},
|
||||
{"dooneevent", Tkapp_DoOneEvent, 1},
|
||||
{"quit", Tkapp_Quit},
|
||||
{"quit", Tkapp_Quit, 1},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
|
@ -1384,9 +1355,6 @@ static void
|
|||
Tkapp_Dealloc(self)
|
||||
PyObject *self;
|
||||
{
|
||||
#ifdef NEED_TKCREATEMAINWINDOW
|
||||
Tk_DestroyWindow (Tkapp_Tkwin (self));
|
||||
#endif
|
||||
Tcl_DeleteInterp(Tkapp_Interp(self));
|
||||
PyMem_DEL(self);
|
||||
}
|
||||
|
@ -1451,12 +1419,12 @@ Tkinter_Create (self, args)
|
|||
static PyMethodDef moduleMethods[] =
|
||||
{
|
||||
{"create", Tkinter_Create, 1},
|
||||
{"createfilehandler", Tkapp_CreateFileHandler, 0},
|
||||
{"deletefilehandler", Tkapp_DeleteFileHandler, 0},
|
||||
{"createtimerhandler", Tkapp_CreateTimerHandler, 0},
|
||||
{"createfilehandler", Tkapp_CreateFileHandler, 1},
|
||||
{"deletefilehandler", Tkapp_DeleteFileHandler, 1},
|
||||
{"createtimerhandler", Tkapp_CreateTimerHandler, 1},
|
||||
{"mainloop", Tkapp_MainLoop, 1},
|
||||
{"dooneevent", Tkapp_DoOneEvent, 1},
|
||||
{"quit", Tkapp_Quit},
|
||||
{"quit", Tkapp_Quit, 1},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
|
@ -1472,7 +1440,7 @@ EventHook ()
|
|||
PyErr_Print();
|
||||
}
|
||||
if (Tk_GetNumMainWindows() > 0)
|
||||
Tk_DoOneEvent(TK_DONT_WAIT);
|
||||
Tcl_DoOneEvent(TCL_DONT_WAIT);
|
||||
return 0;
|
||||
}
|
||||
#endif /* WITH_READLINE */
|
||||
|
@ -1522,15 +1490,15 @@ init_tkinter ()
|
|||
Tkinter_TclError = Py_BuildValue("s", "TclError");
|
||||
PyDict_SetItemString(d, "TclError", Tkinter_TclError);
|
||||
|
||||
ins_long(d, "READABLE", TK_READABLE);
|
||||
ins_long(d, "WRITABLE", TK_WRITABLE);
|
||||
ins_long(d, "EXCEPTION", TK_EXCEPTION);
|
||||
ins_long(d, "X_EVENTS", TK_X_EVENTS);
|
||||
ins_long(d, "FILE_EVENTS", TK_FILE_EVENTS);
|
||||
ins_long(d, "TIMER_EVENTS", TK_TIMER_EVENTS);
|
||||
ins_long(d, "IDLE_EVENTS", TK_IDLE_EVENTS);
|
||||
ins_long(d, "ALL_EVENTS", TK_ALL_EVENTS);
|
||||
ins_long(d, "DONT_WAIT", TK_DONT_WAIT);
|
||||
ins_long(d, "READABLE", TCL_READABLE);
|
||||
ins_long(d, "WRITABLE", TCL_WRITABLE);
|
||||
ins_long(d, "EXCEPTION", TCL_EXCEPTION);
|
||||
ins_long(d, "WINDOW_EVENTS", TCL_WINDOW_EVENTS);
|
||||
ins_long(d, "FILE_EVENTS", TCL_FILE_EVENTS);
|
||||
ins_long(d, "TIMER_EVENTS", TCL_TIMER_EVENTS);
|
||||
ins_long(d, "IDLE_EVENTS", TCL_IDLE_EVENTS);
|
||||
ins_long(d, "ALL_EVENTS", TCL_ALL_EVENTS);
|
||||
ins_long(d, "DONT_WAIT", TCL_DONT_WAIT);
|
||||
ins_string(d, "TK_VERSION", TK_VERSION);
|
||||
ins_string(d, "TCL_VERSION", TCL_VERSION);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue