Attaching files in windows using Python.

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • sri2097

    #1

    Attaching files in windows using Python.

    Hi all,
    I have to select a particular file (using the 'Browse') button in
    Windows. After this I need to populate the 'Open Dialogue Box' with the
    path of the file I need (I have the entier path of the file I need).
    Then I need to select the 'Open' Button.

    Only after this the file I want is attached.

    Any idea as to how this can be done using 'Win32 API's.

    While looking for the proper answer to this I found that 'Mark
    Hammond's' Python for Windows documentation is not detail enough.

    Any help in this regard would be much appreciated.

  • sri2097

    #2
    Re: Attaching files in windows using Python.

    Hi all,
    I have got this far till now -

    import win32gui, struct, array, string

    OFN_ALLOWMULTIS ELECT=0x0000020 0
    OFN_EXPLORER=0x 00080000

    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=resultArra y.tostring()
    manyStrings=[]
    # perhaps a loop of string.split would be faster...
    while len(astr) and astr[0]!='\000':
    i=astr.index('\ 000')
    manyStrings.app end(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(astri ng,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+additi onal*'\000')

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

    def buildOfn(result array,filters=N one,initdir=Non e,title=None,
    multisel=1,oldl ook=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_EXPLO RER
    if multisel: flags=flags|OFN _ALLOWMULTISELE CT
    if oldlook: flags=flags&~OF N_EXPLORER
    szfile,maxfile= resultarray.buf fer_info()
    szfilter=szFrom (filters)
    szinitdir=szFro m(initdir)
    sztitle=szFrom( title)
    return struct.pack(
    "3i2P2iPiPi2PI2 hPi2P",
    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(forsa ve=0,filters=No ne,initdir=None ,title=None,
    initfile=None,m ultisel=1,oldlo ok=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=ar rayFrom(initfil e,8192)
    title=arrayFrom (title)
    initdir=arrayFr om(initdir)
    filters=arrayMu lti(filters)
    ofn=buildOfn(re sultBuffer,filt ers,initdir,tit le,multisel,old look)
    if forsave: isok=win32gui.G etSaveFileName( ofn)
    else: isok=win32gui.G etOpenFileName( ofn)
    if not isok: return []
    return arrayToStrings( resultBuffer)

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

    if __name__=='__ma in__':
    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.

    Comment

    • Roger Upole

      #3
      Re: Attaching files in windows using Python.

      You might want to try using win32gui.GetOpe nFileNameW.
      It uses keyword arguments and doesn't require that you
      build a struct yourself:

      win32gui.GetOpe nFileNameW(File ='myfile.txt', Filter='Texts and scripts\0*.txt; *.py\0Py stuff\0*.py\0')

      Roger


      "sri2097" <srikar2097@gma il.com> wrote in message news:1141752053 .029483.42540@p 10g2000cwp.goog legroups.com...[color=blue]
      > Hi all,
      > I have got this far till now -
      >
      > import win32gui, struct, array, string
      >
      > OFN_ALLOWMULTIS ELECT=0x0000020 0
      > OFN_EXPLORER=0x 00080000
      >
      > 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=resultArra y.tostring()
      > manyStrings=[]
      > # perhaps a loop of string.split would be faster...
      > while len(astr) and astr[0]!='\000':
      > i=astr.index('\ 000')
      > manyStrings.app end(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(astri ng,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+additi onal*'\000')
      >
      > def arrayMulti(stri nglist):
      > """return a char array built from many strings, each
      > separated by a \000 byte, and two \000's at the end
      > """
      > return arrayFrom(strin g.join(stringli st,'\000'),2)
      >
      > def buildOfn(result array,filters=N one,initdir=Non e,title=None,
      > multisel=1,oldl ook=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_EXPLO RER
      > if multisel: flags=flags|OFN _ALLOWMULTISELE CT
      > if oldlook: flags=flags&~OF N_EXPLORER
      > szfile,maxfile= resultarray.buf fer_info()
      > szfilter=szFrom (filters)
      > szinitdir=szFro m(initdir)
      > sztitle=szFrom( title)
      > return struct.pack(
      > "3i2P2iPiPi2PI2 hPi2P",
      > 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(forsa ve=0,filters=No ne,initdir=None ,title=None,
      > initfile=None,m ultisel=1,oldlo ok=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=ar rayFrom(initfil e,8192)
      > title=arrayFrom (title)
      > initdir=arrayFr om(initdir)
      > filters=arrayMu lti(filters)
      > ofn=buildOfn(re sultBuffer,filt ers,initdir,tit le,multisel,old look)
      > if forsave: isok=win32gui.G etSaveFileName( ofn)
      > else: isok=win32gui.G etOpenFileName( ofn)
      > if not isok: return []
      > return arrayToStrings( resultBuffer)
      >
      > def _test():
      > return openNames(
      > filters=('Texts and scripts','*.txt ;*.py','Py stuff','*.py*')
      > )
      >
      > if __name__=='__ma in__':
      > 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.
      >[/color]



      ----== Posted via Newsfeeds.Com - Unlimited-Unrestricted-Secure Usenet News==----
      http://www.newsfeeds.com The #1 Newsgroup Service in the World! 120,000+ Newsgroups
      ----= East and West-Coast Server Farms - Total Privacy via Encryption =----

      Comment

      Working...