Please email me at  nahmed@esri.com - let's figure it out first and then we'll post the outcome to this thread. Please let me know what data/values you'll use and how.
What I would like to achieve is create a simple form allowing the user to set some parameters using dropdown controls, textbox, checbox, etc. along with buttons. This form would then run my ArcPy script after user clicked "Run".
@Olivier: officially, ArcPy does not support Tkinter inside ArcMap. Olivier, I am interested about your need for using Tkinter in ArcMap. Could you please let me know what you are trying to do with a custom GUI? I would like to investigate why your workflow cannot be implemented with our current scripting framework. Thanks.
WARNING: I saved and closed the map document that worked with Mathew's sample. Now, whenever I attempt to re-open that particular map document, it crashes 😞
# Author:  Jennifer (esri_id: jenn775) # Created: July 20, 2010 # Edits:   Mathew Coyle, May 24, 2012 from Tkinter import * import arcpy # SelectPopup.py sample Python script using Tkinter for a user interface # User selects feature from list, code selects and zooms to feature # Use in ArcMap by attaching script to a button for best results # In ArcGIS 10, you can add scripts and models to buttons in the UI without using VBA. # Create a Python script tool using this script and then # see "Adding a custom tool to a menu or toolbar" in this help topic: # http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//002400000005000000.htm Layer = arcpy.GetParameterAsText(0) # Layer SelField = arcpy.GetParameterAsText(1) # Field to Select Title = arcpy.GetParameterAsText(2) # Title (optional) # Troubleshooting messages #arcpy.AddMessage("Layer is "+repr(Layer)) #arcpy.AddMessage("Selection field is "+repr(SelField)) #arcpy.AddMessage("Title is " + repr(Title)) class Application(Frame):    def __init__(self, master=None):        Frame.__init__(self, master)        self.grid()        self.createWidgets(master)    def createWidgets(self, master):        self.yScroll = Scrollbar ( self, orient=VERTICAL )        self.yScroll.grid ( row=0, column=1, sticky=N+S )        self.stList = Listbox (self, yscrollcommand=self.yScroll.set)        self.stList.grid( row=0, column=0 )        self.yScroll["command"] = self.stList.yview        # populate list with choices, sorted ascending        mxd = arcpy.mapping.MapDocument("CURRENT")        for lyr in arcpy.mapping.ListLayers(mxd):            if lyr.name == Layer:                break        # for large datasets where the selection field contains many blanks or        # non-unique values, you can create a summary table and set SelTable        # equal to it for faster creation of the selection dialog        SelTable = lyr.dataSource        rows = arcpy.SearchCursor(SelTable, "", "", SelField, SelField + " A")        oldVal = ""        for row in rows:            newVal = row.getValue(SelField)            #only add value to Listbox if it is not a duplicate            if newVal <> oldVal:                self.stList.insert( END, row.getValue(SelField) )            oldVal = newVal        #add selection and quit button        self.selButton = Button (self, text='Select', command=self.selectFeat)        self.selButton.grid( row=0, column=2 )        self.quitButton = Button ( self, text='Quit', command=master.destroy )        self.quitButton.grid( row=1, column=2 )    def selectFeat(self):        sel = self.stList.curselection()        myFeature = self.stList.get(sel[0])        def BuildQuery(table, field, operator, value=None):            """Generate a valid ArcGIS query expression            arguments              table - input feature class or table view              field - field name (string)              operator - SQL operators ("=","<>", etc)                 "IS NULL" and "IS NOT NULL" are supported              value - query value (optional)            """            # Adds field delimiters            qfield=arcpy.AddFieldDelimiters(table,field)            # tweak value delimeter for different data types            if type(value) == str:                # add single quotes around string values                qvalue = "'" + value + "'"            elif value == None:                # drop value when not specified (used for IS NULL, etc)                qvalue = ""            else:                # numeric values are fine unmodified                qvalue = value            sql = "{0} {1} {2}".format(qfield,operator,qvalue)            #print repr(sql)            return sql.strip()        where = BuildQuery(Layer, SelField, "=", myFeature)        arcpy.AddMessage(where)        arcpy.SelectLayerByAttribute_management(Layer, "NEW_SELECTION", where)        mxd = arcpy.mapping.MapDocument("CURRENT")        for df in arcpy.mapping.ListDataFrames(mxd):            if df.name == mxd.activeView:                df.zoomToSelectedFeatures()                arcpy.RefreshActiveView() root = Tk() app = Application(master=root) app.master.title(Title) app.mainloop()
class MyApp(object):    def __init__(self, root):        self.root = root        [...] def main():    root = Tk()    myapp = MyApp(root)    root.title("Export Tool")    root.update()    root.mainloop() if __name__ == '__main__':    main()
class Application(Frame): Â Â Â def __init__(self, master=None): Â Â Â Â Â Â Â Frame.__init__(self, master) Â Â Â Â Â Â Â self.grid() Â Â Â Â Â Â Â self.createWidgets(master) Â Â Â def createWidgets(self, master): Â Â Â Â Â Â Â [...] root = Tk() app = Application(master=root) app.master.title(Title) app.mainloop()
Signed in members can post, follow updates, and more. New here? Register a free account.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.