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()
Aangemelde leden kunnen berichten plaatsen, updates volgen en meer. Nieuw hier? Registreer een gratis account.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.