Attaching files in windows using Python.

sri2097 srikar2097 at gmail.com
Tue Mar 7 18:20:53 CET 2006


Hi all,
I have got this far till now -

import win32gui, struct, array, string

OFN_ALLOWMULTISELECT=0x00000200
OFN_EXPLORER=0x00080000

def arrayToStrings(resultArray):
    """return list-of-strings corresponding to a char array,
       where each string is terminated by \000, and the whole
       list by two adjacent \000 bytes
    """
    astr=resultArray.tostring()
    manyStrings=[]
    # perhaps a loop of string.split would be faster...
    while len(astr) and astr[0]!='\000':
        i=astr.index('\000')
        manyStrings.append(astr[:i])
        astr=astr[i+1:]
    return manyStrings

def szFrom(anarray):
    """return the string-pointer (sz) corresponding to a char
       array, 0 (null pointer) if no array
    """
    if anarray: return anarray.buffer_info()[0]
    else: return 0

def arrayFrom(astring,additional=0):
    """return a char array built from a string, plus 0
       or more \000 bytes as filler
    """
    if not astring: astring=''
    return array.array('c',astring+additional*'\000')

def arrayMulti(stringlist):
    """return a char array built from many strings, each
       separated by a \000 byte, and two \000's at the end
    """
    return arrayFrom(string.join(stringlist,'\000'),2)

def buildOfn(resultarray,filters=None,initdir=None,title=None,
             multisel=1,oldlook=0):
    """build an OPENFILENAME struct as a string, with several
       options and a given result-array for the string[s] that
       will result from the GetOpenFileName call
    """
    flags=OFN_EXPLORER
    if multisel: flags=flags|OFN_ALLOWMULTISELECT
    if oldlook: flags=flags&~OFN_EXPLORER
    szfile,maxfile=resultarray.buffer_info()
    szfilter=szFrom(filters)
    szinitdir=szFrom(initdir)
    sztitle=szFrom(title)
    return struct.pack(
        "3i2P2iPiPi2PI2hPi2P",
        76, 0, 0,           # size, owner-hwnd, hinstance
        szfilter, 0, 0, 0,  # filter, custom-filter,
max-cust-filter,filter-index
        szfile, maxfile,    # file, max-file
        0, 0,               # file-title, max-file-title
        szinitdir, sztitle, # initial-dir, dialog-title
        flags, 0, 0,        # flags, file-offset, file-extension
        0,                  # def-ext
        0, 0, 0)            # cust-data, func-hook, template-name

def openNames(forsave=0,filters=None,initdir=None,title=None,
              initfile=None,multisel=1,oldlook=0):
    """return a list of filenames for open or save, given
       interactively by the user through a common-dialog; if
       more than 1 string is returned, the first is the directory,
       followed by the filenames.
    """
    resultBuffer=arrayFrom(initfile,8192)
    title=arrayFrom(title)
    initdir=arrayFrom(initdir)
    filters=arrayMulti(filters)
    ofn=buildOfn(resultBuffer,filters,initdir,title,multisel,oldlook)
    if forsave: isok=win32gui.GetSaveFileName(ofn)
    else: isok=win32gui.GetOpenFileName(ofn)
    if not isok: return []
    return arrayToStrings(resultBuffer)

def _test():
    return openNames(
        filters=('Texts and scripts','*.txt;*.py','Py stuff','*.py*')
    )

if __name__=='__main__':
    print _test()

But hear the Dialogue_box stops and waits for the user to select a
file. But Since I have the entire path of the file, How do I pass it to
the file name to populate the box automatically instead of the user
manually selecting a file.

Any further help will be appreciated.




More information about the Python-list mailing list