Pmw optionMenu dynamic contents display?

S

stewart

I'm writing an app that requires a 3-level optionMenu display. Basically
I'm showing the contents of a 3-dimensional matrix. You choose the first
level in the first optionMenu, the 2nd level in the next level, and the 3rd
level in the last optionMenu. Let's call them Continent,country,state.

continentList = ['N.America', 'S. America', 'Europe', 'Asia', Africa',
'Australia', 'Antarctica']
countryList = [['Canada', 'USA', 'Mexico'],['Argentina','Chile', ..],[other
continents' countries... ]]
stateList = [[['BC','Alberta', ...
'Newfoundland'],['California','Oregon',...'Maine'],['Guadalajara',...]],[[other
continents' countries' states]]

When I open the window, all is well. I can display the following as default
selections:
[ N. America ]
[ Canada ]
[ B.C. ]

Making a selection of a continent, country or state invokes a _getSelection
method that displays the 3 choices. So far so good.

Also, if I change the continent selection, then I get a different default
country in the 2nd optionMenu. But, this is where is goes wrong. I can't
get the list of countries to be updated in the 2nd optionMenu, nor the list
of states to be updated in the state list. How would I do this?

I've tried to include some code at the end of the _getSelection method but
it isn't working. Does anyone has any similar code that they can share?

global continentItems, countryItems, stateItems

def _getSelection(self, choice):
print 'you have chosen %s %s %s' % \
(self.var1.get(),
self.var2.get(),
self.var3.get() )
# above code correctly prints the selected choices from all 3 levels
# next part of code tries to re-draw country list based on
# continent selection, but it doesn't work.
# next line successfully gets list index of chosen continent
i2 = indexContinents(self.var1.get()
# first item in countryList is name of associated continent
self.var2.set(countryList[i2][0])
# next line correctly contains list of countries for selected continent
countryItems = countryList[i2]
# next line croaks: trying to change the 'items' option for optionMenu
# by directly addressing its 'items' parameter: no good
self.method2_menu.config(items = countryItems)

stuck here!
 
S

stewart

Here's a test app to demonstrate the concept, and the difficulty.

#file testselectstate.py
title = 'LeakWarn System Selection'

# Import Pmw from this directory tree.
import sys
sys.path[:0] = ['../../..']

import Tkinter
import Pmw, re

global continentList, countryList, stateList

continentList = ['N.America','C. America', 'S. America']
countryList = [['Canada','USA','Mexico'],
['Guatemala','Nicaragua','Panama'],
['Venezuela','Colombia','Ecuador']]
stateList = [[['BC','Alberta','Saskatchewan','others'],
['California','Oregon','Washington','others'],
['Michoacan','Oaxaca','Monterrey','others']],
[['Guatemala states'],['Nicaragua states'],['Panama states']],
[['Venezuela states'],['Colombia states'],['Ecuador states']]]

# default selection
continentItem = continentList[0]
countryItem = countryList[0][0]
stateItem = stateList[0][0][0]

class selectSystem:
def __init__(self, parent):
# Create and pack the OptionMenu megawidgets.
# The first one has a textvariable.
self.var1 = Tkinter.StringVar()
self.var2 = Tkinter.StringVar()
self.var3 = Tkinter.StringVar()
self.var1.set(continentItem) # N. America
self.var2.set(countryItem) # Canada
self.var3.set(stateItem) # B.C.

self.method1_menu = Pmw.OptionMenu(parent,
labelpos = 'w',
label_text = 'Select Continent:',
menubutton_textvariable = self.var1,
items = continentList,
menubutton_width = 20,
menubutton_direction = 'flush',
command = self._getSelection
)
self.method1_menu.pack(anchor = 'w', padx = 10, pady = 10)

self.method2_menu = Pmw.OptionMenu (parent,
labelpos = 'w',
label_text = 'Select country:',
menubutton_textvariable = self.var2,
items = countryList[0],
menubutton_width = 20,
menubutton_direction = 'flush',
command = self._getSelection
)
self.method2_menu.pack(anchor = 'w', padx = 10, pady = 10)

self.method3_menu = Pmw.OptionMenu (parent,
labelpos = 'w',
label_text = 'Select state:',
menubutton_textvariable = self.var3,
items = stateList[0][0],
menubutton_width = 20,
menubutton_direction = 'flush' ,
command = self._getSelection
)
self.method3_menu.pack(anchor = 'w', padx = 10, pady = 10)

menus = (self.method1_menu, self.method2_menu, self.method3_menu)
Pmw.alignlabels(menus)

# Create the dialog.
self.dialog = Pmw.Dialog(parent,
buttons = ('OK', 'Apply', 'Cancel', 'Help'),
defaultbutton = 'OK',
title = 'Select State',
command = self.execute)
self.dialog.withdraw()

# Add some contents to the dialog.
w = Tkinter.Label(self.dialog.interior(),
text = 'Pmw Dialog\n(put your widgets here)',
background = 'black',
foreground = 'white',
pady = 20)
w.pack(expand = 1, fill = 'both', padx = 4, pady = 4)

def showAppModal(self):
self.dialog.activate(geometry = 'centerscreenalways')

def execute(self, result):
print 'You clicked on', result
if result not in ('Apply', 'Help'):
self.dialog.deactivate(result)

def _getSelection(self, choice):
# Can use 'self.var.get()' instead of 'getcurselection()'.
print 'You have chosen %s : %s : %s' % \
(self.var1.get(),
self.var2.get(),
self.var3.get() )
print choice # debug
i2 = indexContinent(self.var1.get())
self.var2.set(countryList[i2][0])
countryItem = countryList[i2]
#print pipelineItems # debug
self.method2_menu.config(items = countryList)
#s3 = systemElements.indexpipe(s2,test2)

def __call__(self):
self.dialog.show()

def indexContinent(name):
found = 'false'
for i in range(len(continentList)):
check = continentList
# print 'checking %s in %s' % (name, check) # debug
if re.search(name,check):
found = 'true'
break
print found
if (found=='true'):
#print 'index of %s is %s' % (name,i) # debug
return i
else:
return -1

def indexCountry(continentindex, name):
found = 'false'
for i in range(len(countryList[continentindex])):
check = countryList[continentindex]
# print 'checking %s in %s' % (name, check) # debug
if re.search(name,check):
found = 'true'
break
print found
if (found=='true'):
#print 'index of %s is %s' % (name,i) # debug
return i
else:
return -1


######################################################################

# Create selectSystem in root window for testing.
if __name__ == '__main__':
root = Tkinter.Tk()
Pmw.initialise(root)
root.title(title)

OKButton = Tkinter.Button(root, text = 'OK', command = root.destroy)
OKButton.pack(side = 'bottom')

widget = selectSystem(root)
root.mainloop()
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,537
Members
45,020
Latest member
GenesisGai

Latest Threads

Top