Tkinter custom drawing

James Stroud jstroud at
Sat Jun 9 00:51:13 CEST 2007

Xavier Bérard wrote:
>>>Now, the problem, is that I have already plenty of widgets on my
>>>screen. I just want to draw over them, which is a bit difficult in my
>>>comprehension of things.
>>What are you trying to achieve by "drawing over" widgets?
> Want I want to do is a sort of GUI builder for Tkinter. I already
> finished a rough version, but for now I'm making a lighter version of
> this project. So, my intent, is to create a widget under the widget.
> While dragging the mouse, I want to see this rectangle that defines
> the boundaries of the new widget I'm creating.
> Sorry for being unclear.

You may want to look into the place() method. The python mega widgets 
(PMW) has a PanedWidget that implements this smoothly. You may want to 
emulate that approach:

#! /usr/bin/env python

from Tkinter import *

def button_pressed(e):
   moved = e.widget
   moved.move_pending = True
   moved['cursor'] = 'hand1'
   moved.press_x = e.x
   moved.press_y = e.y

def button_moved(e):
   moved = e.widget
   if moved.move_pending:
     moved.after_idle(lambda e=e: _button_moved(e))
     moved.move_pending = False

def _button_moved(e):
   moved = e.widget
   delta_x = e.x - moved.press_x
   delta_y = e.y - moved.press_y
   size, wx, wy = moved.winfo_geometry().split('+')
   new_x = int(wx) + delta_x
   new_y = int(wy) + delta_y, y=new_y)
   moved.move_pending = True

def button_up(e):
   e.widget['cursor'] = ''

def register(widget):
   widget.bind('<ButtonPress-3>', button_pressed)
   widget.bind('<B3-Motion>', button_moved)
   widget.bind('<Any-ButtonRelease-3>', button_up)

def test():
   tk = Tk()

   b = Button(tk, text='Button')
   c = Button(tk, text='Another Button')
   x = Label(tk, text='Drag Me', relief=RIDGE, border=1)


if __name__ == "__main__":


More information about the Python-list mailing list