3

I tried to specify a feature class from a GDB dataset through Python Tkinter tkFileDialog.askopenfilename. Below is the script. It worked for me in the past when I was dealing with .txt or .las files. However, this time it is not giving me the GDB feature class, which has no file extension here. Please advise.

import arcpy
from arcpy import env

import Tkinter,tkFileDialog
from Tkinter import *
import tkMessageBox
import ttk
from tkFileDialog import askopenfilename
from tkFileDialog import askopenfile


env.workspace = "C:\\temp\\miniPilot\\miniPilot.gdb"

def browseFor_inFC():
    inFC_name = tkFileDialog.askopenfilename(parent=root, initialdir=r'C:\temp\miniPilot\miniPilot.gdb\data', \
                                                   title='Choose a feature class')
    inFC.set(inFC_name)

def cancel():
    root.destroy()

def remove():
    fields = arcpy.ListFields(inFC)

    for field in fields:
        print field.name
        if field.name <> "OBJECTID" and field.name <> "SHAPE" and field.name <> "SHAPE_Length":

            arcpy.DeleteField_management(inFC, field.name)



root=Tk()
root.title("XXXXXX")

# The first frame named 'mainframe'
mainframe = Frame(root, relief='flat', borderwidth=6)
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)

# set up Tkinter variables, which are global variables, for the first gui -- the root window
inFC = StringVar()

# widgets on the mainframe
Label(mainframe, text="Specify the feature class: ").grid(column=1, row=1, sticky=E)
inFC_entry = Entry(mainframe, width=36, textvariable=inFC)
inFC_entry.grid(column=2, row=1, sticky=(W, E))
inFC_browser_Button=Button(mainframe, text="...", height=1, width=3, command=browseFor_inFC).grid(column=3, row=1, sticky=W)

# two button widgets 
refract_Button=Button(mainframe, text="OK", command=remove).grid(column=0, row=2, sticky=E)
cancel_Button=Button(mainframe, text="CANCEL", command=cancel).grid(column=4, row=3, sticky=W)

for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5)

root.mainloop()   # create an event loop
  • Right. I used arcpy to specify a GDB feature class before. However, I cannot create multiple nice-looking GUIs with arcpy.:-) So, the question here is, is there a way to specify a GDB feature class through a Tkinter GUI? Thanks. – Alex JL Oct 25 '14 at 21:26
  • Why not use pythonaddins.OpenDialog? – Jason Scheirer Oct 26 '14 at 1:00
  • Here's the update: – Alex JL Oct 26 '14 at 15:19
  • def browseFor_inFC(): ws_name = tkFileDialog.askdirectory() #print ws_name env.workspace = ws_name #print env.workspace wsName.set(ws_name) feature_classes = [] #fc = () for dirpath, dirnames, filenames in arcpy.da.Walk(ws_name, datatype="FeatureClass",type="Polyline"): for filename in filenames: feature_classes.append(os.path.join(dirpath, filename)) print filename print feature_classes #print fc #fcCombo['values']=fc – Alex JL Oct 26 '14 at 15:20
2

Here's the update: I used tkFileDialog.askdirectory() to get the gdb name to set the workspace. Then I used arcpy.da.Walk() from the data access module to load the feature classes into an array. My next step would be, put a ttk combobox on the GUI and load feature classes into the drop-down of the combobox so users get to specify the feature class to do whatever further manipulations. A portion of the script is listed below. Definitely, I am going to try pythonaddins.OpenDialog, too. Thanks Jason for pointing to a new direction.

def browseFor_inFC():
    ws_name = tkFileDialog.askdirectory()
    #print ws_name
    env.workspace = ws_name
    #print env.workspace
    wsName.set(ws_name)
    feature_classes = []
    #fc = ()
    for dirpath, dirnames, filenames in arcpy.da.Walk(ws_name, datatype="FeatureClass",type="Polyline"):
        for filename in filenames:
            feature_classes.append(os.path.join(dirpath, filename))
            print filename

    print feature_classes
    #print fc
    #fcCombo['values']=fc
0

You can't use a file dialogue to select a FileGDB feature class as it is not a file, it's part of a database. You need to use Esri arcpy or a library that implements the Esri FileGDB or Open FileGDB APIs such as GDAL.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.