Pmw optionMenu dynamic contents display?

Discussion in 'Python' started by stewart, Feb 23, 2004.

  1. stewart

    stewart Guest

    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!
    stewart, Feb 23, 2004
    #1
    1. Advertising

  2. stewart

    stewart Guest

    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()
    stewart, Feb 23, 2004
    #2
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Thor

    Optionmenu.

    Thor, Sep 4, 2003, in forum: Python
    Replies:
    4
    Views:
    406
    Michael Peuser
    Sep 5, 2003
  2. Stewart Midwinter

    How to link 3 Tkinter OptionMenu lists?

    Stewart Midwinter, Feb 25, 2004, in forum: Python
    Replies:
    2
    Views:
    661
    Eric Brunel
    Feb 25, 2004
  3. Jeffrey Barish
    Replies:
    2
    Views:
    506
    Russell E. Owen
    Apr 22, 2004
  4. J Wolfe

    Pmw optionmenu color

    J Wolfe, Aug 24, 2009, in forum: Python
    Replies:
    0
    Views:
    290
    J Wolfe
    Aug 24, 2009
  5. Replies:
    0
    Views:
    189
Loading...

Share This Page