[Tutor] Pmw ScrolledCanvas Issues ..........

Suresh Kumar Suresh Kumar" <suresh_vsamy@rediffmail.com
Tue Jun 10 03:43:02 2003


Hi,
    I am using python/tkinter/Pmw in my application. As a beginer 
to Pmw, i executed some demo programs given in "Demos" directory 
of Pmw. I could able to understand most of the programs since i am 
familiar with tkinter. Still i have some doubts in 
"ScrolledCanvas". The problem is setting sroll bar to the center 
of the canvas after scalling. I have placed some rectangles, ovals 
in the canvas and used "scale" to scall the canvas. After scalling 
i called "resizescrollregion()" and tried to place the scroll bar 
to the center (Using yview('moveto',...)). But the scroll bars are 
moving only one direction. This means, verticalscrollbar is moving 
"Up" and   horizantalscroll bar is moving "Right". It is not 
moving to center. My coding is given below.


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

import Tkinter
import Pmw

class Demo:
     def __init__(self, parent):
 	# Create the ScrolledCanvas.
 	self.sc = Pmw.ScrolledCanvas(parent,
 		borderframe = 1,
 		labelpos = 'n',
 		label_text = 'ScrolledCanvas',
 		usehullsize = 1,
 		hull_width = 500,
 		hull_height = 400,
 	)

 	# Create a group widget to contain the scrollmode options.
 	w = Pmw.Group(parent, tag_text='Scroll mode')
 	w.pack(side = 'bottom', padx = 5, pady = 5)

 	hmode = Pmw.OptionMenu(w.interior(),
 		labelpos = 'w',
 		label_text = 'Horizontal:',
 		items = ['none', 'static', 'dynamic'],
 		command = self.sethscrollmode,
 		menubutton_width = 8,
 	)
 	hmode.pack(side = 'left', padx = 5, pady = 5)
 	hmode.invoke('dynamic')

 	vmode = Pmw.OptionMenu(w.interior(),
 		labelpos = 'w',
 		label_text = 'Vertical:',
 		items = ['none', 'static', 'dynamic'],
 		command = self.setvscrollmode,
 		menubutton_width = 8,
 	)
 	vmode.pack(side = 'left', padx = 5, pady = 5)
 	vmode.invoke('dynamic')

 	buttonBox = Pmw.ButtonBox(parent)
 	buttonBox.pack(side = 'bottom')
 	buttonBox.add('yview', text = 'Show\nyview', command = 
self.showYView)
 	buttonBox.add('scroll', text = 'Page\ndown', command = 
self.pageDown)
 	buttonBox.add('center', text = 'Center', command = 
self.centerPage)

 	# Pack this last so that the buttons do not get shrunk when
 	# the window is resized.
 	self.sc.pack(padx = 5, pady = 5, fill = 'both', expand = 1)

 	self.sc.component('canvas').bind('<1>', self.addcircle)
 	self.sc.component('canvas').bind('<2>', self.scalecanvas)
 	self.sc.component('canvas').bind('<3>', self.zoomout)
         testEntry = Tkinter.Entry(parent)
 	self.sc.create_line(20, 20, 100, 100)
 	self.sc.create_oval(100, 100, 200, 200, fill = 'green',tag = 
'oval')
 	self.sc.create_rectangle("10m","10m","20m","20m",fill='blue')
 	# Set the scroll region of the canvas to include all the items
 	# just created.
 	self.sc.resizescrollregion()

 	self.colours = ('red', 'green', 'blue', 'yellow', 'cyan', 
'magenta',
 		'black', 'white')
 	self.oval_count = 0
         self.rand = 12345

     def zoomout(self,event):
         self.sc.scale('all',0,0,0.5,0.5)
 	self.sc.resizescrollregion()

     def scalecanvas(self,event):
         self.sc.scale('all',0,0,2,2)
         self.sc.resizescrollregion()
       	self.centerPage()

     def sethscrollmode(self, tag):
 	self.sc.configure(hscrollmode = tag)

     def setvscrollmode(self, tag):
 	self.sc.configure(vscrollmode = tag)

     def addcircle(self, event):
 	x = self.sc.canvasx(event.x)
 	y = self.sc.canvasy(event.y)
 	width = 10 + self.random() % 100
 	height = 10 + self.random() % 100
 	self.sc.create_oval(
 	    x - width, y - height, x + width, y + height,
 	    fill = self.colours[self.oval_count])
 	self.oval_count = (self.oval_count + 1) % len(self.colours)
 	self.sc.resizescrollregion()

     #Simple random number generator.
     def random(self):
         self.rand = (self.rand * 125) % 2796203
         return self.rand

     def showYView(self):
         print self.sc.yview()

     def pageDown(self):
         self.sc.yview('scroll', 1, 'page')

     def centerPage(self):
         top, bottom = self.sc.yview()
         size = bottom - top
         middle = 0.5 - size / 2
         self.sc.yview('moveto', middle)
         left,right = self.sc.xview()
         size = right - left
          middle = 0.5 - size / 2
         self.sc.xview('moveto', middle)

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

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

     exitButton = Tkinter.Button(root, text = 'Exit', command = 
root.destroy)
     exitButton.pack(side = 'bottom')
     widget = Demo(root)
     root.mainloop()


   How can i place the scroll bar to center of canvas after 
scalling.

With Regards,
V.Suresh Kumar


___________________________________________________
Get email that means BUSINESS! me @ mycompany.com.
Just Rs.1499/year.
To start, click http://www.rediffmailpro.com