The GTK+ wrapper for Guile is a part of Guile-GNOME. It's a good idea
to read the (gnome gobject)
documentation first.
See Contents.
The following code can be found in the file
gtk/examples/hello.scm
in your distribution.
(use-modules (oop goops) (gnome gobject) (gnome gtk)) ;; define the app as a function -- there are many other ways to do ;; this, of course... (define (hello) ;; every widget has a class. here we define a window and a button. (let* ((window (make <gtk-window> #:type 'toplevel)) (button (make <gtk-button> #:label "Hello, World!"))) (gtk-container-set-border-width window 10) (gtk-container-add window button) ;; of course you can attach a lambda to a signal :-) (gtype-instance-signal-connect button 'clicked (lambda (b) (gtk-main-quit))) (gtk-widget-show-all window) ;; this will block until gtk-main-quit is called... (gtk-main))) ;; meaning this blocks until the button is clicked. (hello)
hello world
, improvedThere's something about this that resembles programming in C a little
bit too much. In Python, you can just do window.add(button)
.
That's a lot less typing. In GOOPS, the object framework for Guile,
methods are implemented a bit differently – See (gnome gobject generics).
If we use the GOOPS methods, hello-generics.scm
looks a bit different:
(use-modules (oop goops) (gnome gobject) (gnome gtk) (gnome gobject utils)) (define (hello) (let* ((window (make <gtk-window> #:type 'toplevel)) (button (make <gtk-button> #:label "Hello, World!"))) ;; since window is a container, this generic maps onto the ;; function gtk-container-set-border-width (set-border-width window 10) ;; note that we can set the border width with a gobject property ;; as well: (gobject-set-property window 'border-width 15) ;; (gnome gobject generics), re-exported by (gnome gtk), defines a ;; generic `set' method for gobject-set-property, se we can also ;; do it like this: (set window 'border-width 20) ;; or, like this, using with-accessors from (gnome gobject utils): (with-accessors (border-width) (set! (border-width window) 20)) ;; this is much less typing :-) (add window button) ;; see (gnome gobject generics) for a full list of gobject generic ;; functions (connect button 'clicked (lambda (b) (gtk-main-quit))) ;; generic functions for .defs apis are defined in the .defs files, ;; not manually (show-all window) (gtk-main))) (hello)