[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