I want to use a list to contain variables in a series of option-menu
toggles. I've got 15 options to set, so I would like to use a single
for loop to draw the 15 menu items and use a list containing Tkinter
IntVar instances to keep track of the value of these options. But,
Tkinter doesn't seem to like me using a list member as the variable in
the menu. Is there a way to do what I want? Interestingly, I *can* use list elements to create menus if I use basic Tkinter menus. But I want to use Pmw menus!
Here's a sample app with the offending behaviour:
#test-opts.py
import sys, thread, string, os, time
class rsyncApp:
def __init__(self, parent):
'''define rsync defaults; get from settings file if it exists'''
self.font = ('Helvetica', 10) #default font
os.chdir(folder)
# Add some buttons to the MenuBar.
menuBar.addmenu('File', 'Connect or quit')
# File menu item 0
menuBar.addmenuitem('File', 'command', 'Exit the application',
command = self.quit,
font = self.font,
label = 'Exit')
menuBar.addmenu('Edit', 'Edit Options')
self.names = ["Quiet","Recursive",
"Relative path names","Update only",
"Preserve times","Dry run",
"only update Existing","Delete missing source",
"Delete excluded on dest",
"Delete excluded from source","ignore times",
"Use size only", "CVS-exclude",
"print version (ignore other options)","help
(ignore other options)",]
self.opts = []
for i in range(0,15):
self.opts.append(None)
for i in range(0,15):
# Create a checkbutton menu item.
self.opts[i] = Tkinter.IntVar()
# Initialise the checkbutton to 1:
self.opts[i].set(0)
print "Options:", self.opts
for i in range(0,15):
print '%s: %i ' % (self.names[i], self.opts[i].get())
menuBar.addmenuitem('Options', 'checkbutton', self.names[i],
label = self.names[i],
font = self.font,
command = self._toggleMe,
variable = self.opts[i])
self._toggleMe()
def _toggleMe(self):
'''get the option settings'''
for i in range(0,15):
print '%s value:' %self.names[i], self.opts[i].get()
def quit(self):
'''clean up nicely when we quit'''
root.destroy()
root.quit()
if __name__ == '__main__':
OS = os.name.lower()
if OS == 'ce':
import osce
import pythonrc #contains the sys.path.append() commands
folder = '\\My Documents\\Python'
else:
# we are on the desktop
sys.path.append('c:\\programs')
folder = os.getcwd()
import Tkinter, Pmw
from tkMessageBox import *
Hi all:
I want to use a list to contain variables in a series of option-menu
toggles. I've got 15 options to set, so I would like to use a single
for loop to draw the 15 menu items and use a list containing Tkinter
IntVar instances to keep track of the value of these options. But,
Tkinter doesn't seem to like me using a list member as the variable in
the menu. Is there a way to do what I want? Interestingly, I *can* use list elements to create menus if I use basic Tkinter menus. But I want to use Pmw menus!
Here's a sample app with the offending behaviour:
#test-opts.py
import sys, thread, string, os, time
class rsyncApp:
def __init__(self, parent):
'''define rsync defaults; get from settings file if it exists'''
self.font = ('Helvetica', 10) #default font
os.chdir(folder)
def drawGUI(self, parent):
'''Create and pack the MenuBar.'''
menuBar = Pmw.MenuBar(parent,
hull_relief = 'raised',
hull_borderwidth = 1)
menuBar.pack(fill = 'x')
self.menuBar = menuBar
# Add some buttons to the MenuBar.
menuBar.addmenu('File', 'Connect or quit')
# File menu item 0
menuBar.addmenuitem('File', 'command', 'Exit the application',
command = self.quit,
font = self.font,
label = 'Exit')
menuBar.addmenu('Edit', 'Edit Options')
self.names = ["Quiet","Recursive",
"Relative path names","Update only",
"Preserve times","Dry run",
"only update Existing","Delete missing source",
"Delete excluded on dest",
"Delete excluded from source","ignore times",
"Use size only", "CVS-exclude",
"print version (ignore other options)","help
(ignore other options)",]
self.opts = []
for i in range(0,15):
self.opts.append(None)
for i in range(0,15):
# Create a checkbutton menu item.
self.opts[i] = Tkinter.IntVar()
# Initialise the checkbutton to 1:
self.opts[i].set(0)
print "Options:", self.opts
for i in range(0,15):
print '%s: %i ' % (self.names[i], self.opts[i].get())
menuBar.addmenuitem('Options', 'checkbutton', self.names[i],
label = self.names[i],
font = self.font,
command = self._toggleMe,
variable = self.opts[i])
self._toggleMe()
def _toggleMe(self):
'''get the option settings'''
for i in range(0,15):
print '%s value:' %self.names[i], self.opts[i].get()
def quit(self):
'''clean up nicely when we quit'''
root.destroy()
root.quit()
if __name__ == '__main__':
OS = os.name.lower()
if OS == 'ce':
import osce
import pythonrc #contains the sys.path.append() commands
folder = '\\My Documents\\Python'
else:
# we are on the desktop
sys.path.append('c:\\programs')
folder = os.getcwd()
import Tkinter, Pmw
from tkMessageBox import *
root = Tkinter.Tk()
#initialise global vars
global sizex, sizey, startx, starty
if OS == 'ce':
sizex, sizey = root.wm_maxsize()
startx = 0; starty = 0
sizex = sizex - startx -6
sizey = sizey - starty -6
else:
xmax, ymax = root.wm_maxsize()
sizex, sizey = (240, 400)
startx = xmax/4; starty = ymax/4
Pmw.initialise(root)
root.title('rsync')
global geometry
geometry = "%dx%d+%d+%d"%(sizex,sizey,startx,starty)
root.wm_geometry(geometry)
root.update()
app = rsyncApp(root)
app.drawGUI(root)
root.mainloop()
thanks,
S