使用tkinter时无限循环

时间:2012-02-01 00:31:13

标签: python tkinter gis

我有一个正常运行的脚本,直到我添加了一个用于用户交互的文件查询框。它不断重复该问题,并且只有在通过使输入/输出文件相同而强制使以下命令(shutil.copy2)崩溃时才退出。为什么呢?

import os, xml, arcpy, shutil, datetime, Tkinter,tkFileDialog
from xml.etree import ElementTree as et 

path=os.getcwd()
RootDirectory=path
arcpy.env.workspace = path
Count=0

Generated_XMLs=RootDirectory+'\GeneratedXML_LOG.txt'
f = open(Generated_XMLs, 'a')
f.write("Log of Metadata Creation Process - Update: "+str(datetime.datetime.now())+"\n")
f.close()

for root, dirs, files in os.walk(RootDirectory, topdown=False):
    #print root, dirs
    for directory in dirs:
        currentPath=os.path.join(root,directory)
        os.chdir(currentPath)
        arcpy.env.workspace = currentPath
        print currentPath
#def Create_xml(currentPath):

        FileList = arcpy.ListFeatureClasses()
        zone="_Zone"

        for File in FileList:
            Count+=1
            FileDesc_obj = arcpy.Describe(File)
            FileNm=FileDesc_obj.file
            print FileNm

            check_meta=os.listdir(currentPath)
            existingXML=FileNm[:FileNm.find('.')]
            existingExtension=FileNm[FileNm.find('.'):]
            print "XML: "+existingXML
            print check_meta
            #if  existingXML+'.xml' in check_meta:
            for f in check_meta:
             if f.startswith(existingXML) and f.endswith('.xml'):
                print "exists, file name:", f
                newMetaFile=FileNm+"_2012Metadata.xml"
                shutil.copy2(f, newMetaFile)

导致循环的代码

     else:
        #print "Does not exist"
        newMetaFile=FileNm+"_BaseMetadata.xml"
        root = Tkinter.Tk()
        file = tkFileDialog.askopenfile(parent=root,mode='rb',title='Choose a xml base file to match with: '+File)
        if file != None:
             metafile=os.path.abspath(file.name)
             file.close()
             print metafile
             shutil.copy2(metafile,newMetaFile)
             print "copied"
        else:
        shutil.copy2('L:\Data_Admin\QA\Metadata_python_toolset\Master_Metadata.xml', newMetaFile)

    tree=et.parse(newMetaFile)        
    print "Processing: "+str(File)  

其余的工作代码

            for node in tree.findall('.//title'):
                node.text = str(FileNm)
            for node in tree.findall('.//northbc'):
                node.text = str(FileDesc_obj.extent.YMax)
            for node in tree.findall('.//southbc'):
                node.text = str(FileDesc_obj.extent.YMin)
            for node in tree.findall('.//westbc'):
                node.text = str(FileDesc_obj.extent.XMin)
            for node in tree.findall('.//eastbc'):
                node.text = str(FileDesc_obj.extent.XMax)        
            for node in tree.findall('.//native/nondig/formname'):
                node.text = str(os.getcwd()+"\\"+File)
            for node in tree.findall('.//native/digform/formname'):
                node.text = str(FileDesc_obj.featureType)
            for node in tree.findall('.//avlform/nondig/formname'):
                node.text = str(FileDesc_obj.extension)
            for node in tree.findall('.//avlform/digform/formname'):
                node.text = str(float(os.path.getsize(File))/int(1024))+" KB"
            for node in tree.findall('.//theme'):
                node.text = str(FileDesc_obj.spatialReference.name +" ; EPSG: "+str(FileDesc_obj.spatialReference.factoryCode))
            print node.text
            projection_info=[]
            Zone=FileDesc_obj.spatialReference.name

            if "GCS" in str(FileDesc_obj.spatialReference.name):
                projection_info=[FileDesc_obj.spatialReference.GCSName, FileDesc_obj.spatialReference.angularUnitName, FileDesc_obj.spatialReference.datumName, FileDesc_obj.spatialReference.spheroidName]
                print "Geographic Coordinate system"
            else:
                projection_info=[FileDesc_obj.spatialReference.datumName, FileDesc_obj.spatialReference.spheroidName, FileDesc_obj.spatialReference.angularUnitName, Zone[Zone.rfind(zone)-3:]]
                print "Projected Coordinate system"
            x=0
            for node in tree.findall('.//spdom'):
                for node2 in node.findall('.//keyword'):
                    print node2.text
                    node2.text = str(projection_info[x])
                    print node2.text
                    x=x+1


            tree.write(newMetaFile)

            f = open(Generated_XMLs, 'a')
            f.write(str(Count)+": "+File+"; "+newMetaFile+"; "+currentPath+"\n")
            f.close()



    #        Create_xml(currentPath)

3 个答案:

答案 0 :(得分:0)

你发布的代码在第二个else之后有一个缩进错误,但没有循环,除非你迭代的其中一个列表非常非常大。可能需要花费大量时间的复制操作(分析会有所帮助)。

此外,在Python和英语中,避免双重否定是可取的;  if file!= None:  变成if file:

答案 1 :(得分:0)

这是你的循环。

else:
        #print "Does not exist"
        newMetaFile=FileNm+"_BaseMetadata.xml"
         = Tkinter.Tk()
        file = tkFileDialog.askopenfile(parent=root,mode='rb',title='Choose a xml base file to match with: '+File)
        if file != None:
            =os.path.abspath(file.name)
            file.close()    
            print metafile
            shutil.copy2(metafile,newMetaFile)
            print "copied"
        else:
    shutil.copy2('L:\Data_Admin\QA\Metadata_python_toolset\Master_Metadata.xml', newMetaFile)

    tree=et.parse(newMetaFile)        
    print "Processing: "+str(File)  

最后你想说:

break 

那将结束循环

或者您可以使用此(示例)

x=0
for y in z:
    x+=1
if x == 20:
    break

将循环运行20次 哦,在第二个之后,你需要缩进。

答案 2 :(得分:-2)

必须添加一个break语句才能使它退出循环。