[Tutor] Dynamically populate Tkinter OptionMenu with list

Bernard Lebel 3dbernard at gmail.com
Wed Jul 20 15:35:17 CEST 2005


Hello,

I have this problem. I build a list of elements, and I never know in
advance how many or what will be the elements.

I then wish to populate an OptionMenu with this list of elements.

How can I do that?

The reason I'm asking is I'm building a little GUI to enter records in
a SQL table. I want to give the user the choice of tables (with the
OptionMenu), however we never know in advance the menus there will be
in a given database.


My current code below. It all starts with the last function, enterAsset().


# -----------------------------------------------------
# Table filling
# -----------------------------------------------------


def getTables():
	
	""" Get the list of tables from the database. """
	
	oConnection = connect2db()
	oCursor = oConnection.cursor()
	
	oResult = oCursor.execute( "SHOW TABLES" )
	aRows = oCursor.fetchall()
	aTables = [ tRow[0] for tRow in aRows ]
	
	oCursor.close()
	oConnection.close()

	return aTables


	
	
def getTableColumns( sTableName ):
	
	""" Lists and returns the list of columns from a given table. """
	
	oConnection = connect2db()
	oCursor = oConnection.cursor()
	
	oResult = oCursor.execute( "SHOW COLUMNS FROM " + sTableName )
	aRows = oCursor.fetchall()
	aColumns = [ aRow[0] for aRow in aRows if aRow[0] != 'ID' ]
	
	oCursor.close()
	oConnection.close()
	
	return aColumns




# ------------------------
# Tkinter functions

	

def fetchAndDestroy():
	
	"""
	Retrieves the values entered in the input fields.
	Maps them in-place to the label keys dictionary.
	Terminates the input field gui.
	"""

	for oEntry in aEntries:
		sEntry = oEntry.get()
		if sEntry == '': sEntry = 'null'
		dEntryValues.setdefault( str(oEntry), [] ).append( sEntry )
	
	oRoot.destroy()




def makeformAsset( oRoot, aColumns ):
	
	""" Generates the input form, based on the provided list of table columns. """
	
	for sColumn in aColumns:
		
		oRow = Frame( oRoot )
		
		oLabel = Label( oRow, width = 25, text = sColumn, anchor = E )
		oEntry = Entry( oRow, width = 50, relief = RIDGE )
		dEntryValues.setdefault( str(oEntry), [] ).append( sColumn )
		
		oRow.pack( side = TOP, fill = X )
		oLabel.pack( side = LEFT )
		oEntry.pack( side = RIGHT, expand = YES, fill = X )
		
		aEntries.append( oEntry )


def enterAsset():
	
	""" Creates a form to fill in the info to create a new asset. """

	global dEntryValues
	global oRoot
	global aEntries
	
	dEntryValues = {}
	oRoot = Tk()
	aEntries = []
	
	# Get available tables
	aTables = getTables()
	
	var1 = StringVar()
	for sTable in aTables: oOption = OptionMenu( oRoot, var1, sTable )
	oOption.pack( fill = X )
	var1.set( aTables[0] )
	sTableName = var1.get()
	
	# Get columns for this table
	aColumns = getTableColumns( sTableName )

	makeformAsset( oRoot, aColumns )
	Button( oRoot, text = 'OK', command = ( fetchAndDestroy ) ).pack(
side = LEFT, expand = YES, fill = X )
	oRoot.mainloop()



Thanks
Bernard


More information about the Tutor mailing list