Problem in Pmw ScrolledCanvas ..........

suresh_vsamy member30972 at dbforums.com
Tue Jun 10 03:49:25 EDT 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.

--
Posted via http://dbforums.com




More information about the Python-list mailing list