468,549 Members | 2,323 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 468,549 developers. It's quick & easy.

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.

Mar 7 '06 #1
2 1808
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,tit le=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,titl e=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,mu ltisel,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.

Mar 7 '06 #2
You might want to try using win32gui.GetOpenFileNameW.
It uses keyword arguments and doesn't require that you
build a struct yourself:

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

Roger
"sri2097" <sr********@gmail.com> wrote in message news:11*********************@p10g2000cwp.googlegro ups.com...
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,tit le=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,titl e=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,mu ltisel,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.


----== 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 =----
Mar 11 '06 #3

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

3 posts views Thread by Brian Farnhill (MCP VB.NET) | last post: by
2 posts views Thread by john.lehmann | last post: by
reply views Thread by wal | last post: by
2 posts views Thread by ARC | last post: by
10 posts views Thread by sandipm | last post: by
1 post views Thread by UniDue | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.