[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