as well as one that fails (with added blank lines for readability) :\pp \internet\ftpgetfilegui py server name =ftp rmi net user name=lutz local dir =test file name =about-pp html password=xxxxxxxx remote dir =download of "about-pp htmlsuccessful server name =ftp rmi net user name=lutz local dir = :\temp file name =ora-lp -big jpg password=xxxxxxxx remote dir =download of "ora-lp -big jpgsuccessful server name =ftp rmi net user name=lutz local dir = :\temp file name =ora-lp jpg password=xxxxxxxx remote dir =download of "ora-lp jpghas failed ora-lp jpgno such file or directory given username and passwordthe downloader logs into the specified account to do anonymous ftp insteadleave the username and password fields blank nowto illustrate the threading capabilities of this guistart download of large filethen start another download while this one is in progress the gui stays active while downloads are underwayso we simply change the input fields and press submit again this second download starts and runs in parallel with the firstbecause each download is run in threadand more than one internet connection can be active at once in factthe gui itself stays active during downloads only because downloads are run in threadsif they were noteven screen redraws wouldn' happen until download finished we discussed threads in and their application to guis in and but this script illustrates some practical thread concernsthis program takes care to not do anything gui-related in download thread as we've learnedonly the thread that makes guis can generally process them to avoid killing spawned download threads on some platformsthe gui must also be careful not to exit while any downloads are in progress it keeps track of the number of in-progress threadsand just displays pop up if we try to kill the gui by pressing the cancel button while both of these downloads are in progress client-side scripting