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
PolyGeo
65.5k29 gold badges115 silver badges350 bronze badges
asked Oct 25, 2014 at 15:26
4
  • 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. Commented Oct 25, 2014 at 21:26
  • Why not use pythonaddins.OpenDialog? Commented Oct 26, 2014 at 1:00
  • Here's the update: Commented Oct 26, 2014 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 Commented Oct 26, 2014 at 15:20

2 Answers 2

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
answered Oct 26, 2014 at 15:33
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.

PolyGeo
65.5k29 gold badges115 silver badges350 bronze badges
answered Oct 25, 2014 at 20:10

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.