cl-gtk4 项目教程
项目介绍
cl-gtk4 是一个为 Common Lisp 提供的 GTK4/Libadwaita/WebKit2 绑定库。它依赖于 cl-glib 和 cl-gobject-introspection-wrapper,并托管在 GitHub 上。该项目允许开发者使用 Common Lisp 构建跨平台的 GUI 应用程序,支持 Windows、MacOS 和 GNU/Linux 系统。
项目快速启动
安装依赖
首先,确保你已经安装了 Quicklisp 和 Ultralisp。然后,你可以通过以下命令手动安装 cl-gtk4 及其依赖:
(ql:quickload :cl-gtk4)
(ql:quickload :cl-gtk4 adw) ; 如果你需要 libadwaita
(ql:quickload :cl-gtk4 webkit) ; 如果你需要 WebkitGTK
示例代码
以下是一个简单的示例,展示如何在 Common Lisp 中使用 cl-gtk4 创建一个窗口:
(defpackage :cl-gtk4-example
(:use :cl :gtk :gdk :gdk-pixbuf :cairo :pango :glib :gobject :adw :webkit2))
(in-package :cl-gtk4-example)
(defun main ()
(within-main-loop
(let ((window (make-instance 'gtk:window
:title "Hello, cl-gtk4!"
:default-width 400
:default-height 300)))
(g:signal-connect window "destroy"
(lambda (widget)
(declare (ignore widget))
(leave-gtk-main)))
(gtk:widget-show window)))))
(main)
应用案例和最佳实践
多线程处理
GTK 运行在单个线程中,并且不是线程安全的。所有与 UI 相关的操作必须在 GTK 主事件循环中进行。以下是一个多线程处理的示例:
(let ((label (make-label :str "0"))
(count 0))
(bt:make-thread (lambda ()
(loop :repeat 5 :do
(gtk:run-in-main-event-loop
(setf (label-text label) (format nil "~A" (incf count))))
(sleep 1)))))
实时重载
你可以通过重新编译 define-application
宏来实现应用程序的实时重载,而无需关闭窗口:
(define-application "example"
(:main-window (make-instance 'gtk:window
:title "Live Reload Example"
:default-width 400
:default-height 300))
(let ((label (make-label :str "0")))
(gtk:container-add (main-window) label)
(gtk:widget-show-all (main-window))))
典型生态项目
cl-glib
cl-glib 是 GTK 的底层库,提供了许多基础功能和工具,如事件循环、线程和计时器。
cl-gobject-introspection-wrapper
这个库提供了 GObject Introspection 的绑定,使得 Common Lisp 可以与 GTK 和其他 GObject 库进行交互。
WebkitGTK
WebkitGTK 是一个强大的 Web 渲染引擎,通过 cl-gtk4 的绑定,你可以在 Common Lisp 应用程序中嵌入 Web 内容。
通过这些模块的介绍和示例代码,你应该能够快速上手并开始使用 cl-gtk4 构建跨平台的 GUI 应用程序。