[pygtk] Change cursor on a single widget

Timo timomlists at gmail.com
Tue Mar 12 18:41:55 WST 2013


Op 11-03-13 15:49, Neil Muller schreef:
> On 11 March 2013 00:37, Timo <timomlists at gmail.com> wrote:
>> I seem to be unable to change the cursor on one widget only, not an entire
>> window. How is this done? Below is a testscript which I thought was the
>> right way.
>>
>> Run normal to use PyGI, run with -p argument for PyGTK. Both act the same.
>> def run_pygtk():
>>      import gtk
>>
>>      def disable_cb(widget):
>>          widget.set_sensitive(False)
>>          cursor = gtk.gdk.Cursor(gtk.gdk.WATCH)
>>          widget.window.set_cursor(cursor)
> This works for widgets which have their own gtk.gdkWindows. It's
> mentioned in the gtk docs that this isn't always the case, and several
> widgets will return their parent's gtk.gdk.Window. You can check for
> this using the get_has_window method.
Thanks for that. I did read that part, but foolishly assumed it were 
just those few mentioned widgets which don't have a GdkWindow. In my 
real life application, I have stuff packed into a frame=>alignment=>box 
and neither of those have a GdkWindow.

The get_has_window method comes in handy!

Cheers,
Timo

>
> One approach is to stuff the buttons inside an EventBox, since that
> will definitely provide it's own gtk.gdk.Window  - something along the
> lines of:
>
> def run_pygtk():
>      import gtk
>
>      def disable_cb(widget, eventbox):
>          widget.set_sensitive(False)
>          cursor = gtk.gdk.Cursor(gtk.gdk.WATCH)
>          eventbox.window.set_cursor(cursor)
>
>      win = gtk.Window()
>      win.resize(400, 400)
>      win.set_title("PyGTK example")
>      win.connect('delete-event', gtk.main_quit)
>
>      eventbox = gtk.EventBox()
>
>      b1 = gtk.Button('Disable me')
>      b1.connect('clicked', disable_cb, eventbox)
>      eventbox.add(b1)
>      b2 = gtk.Button('I do nothing')
>      box = gtk.VBox()
>      box.pack_start(eventbox, False, False, 0)
>      box.pack_start(b2, False, False, 0)
>      win.add(box)
>      win.show_all()
>



More information about the pygtk mailing list