472,096 Members | 1,420 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,096 software developers and data experts.

Trouble Importing Tkinter in embedded C program

I'm trying to add a Tkinter interface to an existing C program with
embedded python, but seem to have trouble importing Tkinter (or
accessing it). I tried a simple program that would run the script
"hello.py"
This is hello.py:

from Tkinter import *
mainWindow=Tk()
label=Label(mainWindow, text="Hello")
label.grid(row=0,column=0)
mainloop()

My first attempt at embedding this in C was:

#include <Python.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
Py_Initialize();
PySys_SetPath(".");

FILE *fp=fopen("hello.py","r++");
PyRun_SimpleFile(fp,"hello.py");
Py_Finalize();
}

On execution I was told:
Traceback (most recent call last):
File "hello.py", line 1, in ?
from Tkinter import *
ImportError: No module named Tkinter

Using Py_GetPath reported:

/usr/lib/python2.2/:/usr/lib/python2.2/plat-linux2:/usr/lib/python2.2/lib-tk:
/usr/lib/python2.2/lib-dynload

On my SuSE 8.2 installation Tkinter.py is in usr/lib/python2.2/lib-tk/

So I tried to explicitly load the Tkinter module in the program by
inserting the following right after the SetPath:

PyObject *importModule = PyImport_ImportModule("Tkinter");
if (importModule == NULL)
{ printf(" Tkinter import unsuccessful\n");
return 1;
}

When I run this, importModule is coming back as NULL.

Can someone guide me in the right direction to allow calls to Tkinter
through the embedded python? I know there are ways of using Tk/Tcl
through C, but I'm not familiar enough with Tk/Tcl to try that.

Thanks in advance--
Rick Olson
Jul 18 '05 #1
2 3307
Rick Olson wrote:
I'm trying to add a Tkinter interface to an existing C program with
embedded python, but seem to have trouble importing Tkinter (or
accessing it).
[...]

Sounds like a fairly familiar issue with compiled extensions, but I could
be wrong.
Using Py_GetPath reported:

/usr/lib/python2.2/:/usr/lib/python2.2/plat-linux2:/usr/lib/python2.2/lib-tk: /usr/lib/python2.2/lib-dynload

On my SuSE 8.2 installation Tkinter.py is in usr/lib/python2.2/lib-tk/
[...]
Can someone guide me in the right direction to allow calls to Tkinter
through the embedded python? I know there are ways of using Tk/Tcl
through C, but I'm not familiar enough with Tk/Tcl to try that.


If you are able to change the conditions under which the C program is
built (paths, libraries, etc.) then you may want to link against the
_tkinter.so library in the /usr/lib/python2.2/lib-dynload directory.

That's just a guess, however. Maybe this is answered in an FAQ somewhere.

--
http://www.boddie.org.uk/david/Projects/
Jul 18 '05 #2
David Boddie <da****@dcs.st-and.ac.uk> wrote in message news:<bp**********@hercules.btinternet.com>...
Can someone guide me in the right direction to allow calls to Tkinter
through the embedded python? I know there are ways of using Tk/Tcl
through C, but I'm not familiar enough with Tk/Tcl to try that.


If you are able to change the conditions under which the C program is
built (paths, libraries, etc.) then you may want to link against the
_tkinter.so library in the /usr/lib/python2.2/lib-dynload directory.

That's just a guess, however. Maybe this is answered in an FAQ somewhere.


Thanks for the suggestion.

I tried to check the FAQ and newsgroup, but was unsuccessful. I may
well have missed it. I'm not a serious programmer and am frequently
unclear on exactly how to compile, link...

Nevertheless, I tried linking _tkinter.so by changing the makefile a
few different ways all of which amount to the makefile below. FWIW if
I drop the definition of DLL this makefile will compile and run the
examples in Extending and Embedding the Python Interpreter.

Thanks again--
Rick

CC = gcc

PY = /usr/include/python2.2
PYLIB = /usr/lib/python2.2/config/libpython2.2.a
PYINC = -I/usr/include/python2.2 -I/usr/include

# Compiler flags
OPT= -g
CFLAGS= $(OPT)

LIBS= -L/usr/lib \
-L/usr/X11R6/lib \
-ltk8.4 -ltcl8.4 -lnsl -lX11 -ldl -lreadline -lieee -lpthread -lutil
LDFLAGS=-Xlinker -export-dynamic
SYSLIBS=-lm
DLLS= /usr/lib/python2.2/lib-dynload/-tkinter.so
ALLLIBS=$(PYLIB) $(LIBS) $(SYSLIBS)

testtk: testtk.o
$(CC) $(LDFLAGS) testtk.o $(DLLS) $(ALLLIBS) $(OPT) -o testtk

testtk.o: testtk.c
$(CC) testtk.c -c $(OPT) $(PYINC)
Jul 18 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

3 posts views Thread by srijit | last post: by
12 posts views Thread by qwweeeit | last post: by
6 posts views Thread by gmarkowsky | last post: by
44 posts views Thread by bg_ie | last post: by
reply views Thread by Alexnb | last post: by
8 posts views Thread by karthikbalaguru | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.