Debian上Fortran图形界面开发路线
一、路线总览与选型
二、方案一 GTK-Fortran 原生GUI(GTK+ 3)
pkg-config --cflags --libs gtk-3.0文件 window.ui(放在与 app.f90 同目录)
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<object class="GtkApplicationWindow" id="main_window">
<property name="title">Fortran GTK3 示例</property>
<property name="default-width">320</property>
<property name="default-height">200</property>
<child>
<object class="GtkBox" id="vbox">
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label">
<property name="label">Hello, Fortran!</property>
</object>
</child>
<child>
<object class="GtkButton" id="button">
<property name="label">点击我</property>
<signal name="clicked" handler="on_button_clicked" object="main_window"/>
</object>
</child>
</object>
</child>
</object>
</interface>
文件 app.f90
program main
use, intrinsic :: iso_c_binding
implicit none
interface
! 最小化GTK API声明(仅示例用)
function gtk_init(argc, argv) bind(c, name="gtk_init")
import :: c_int, c_ptr
integer(c_int), value :: argc, argv
end function gtk_init
function g_application_new(app_id, flags) bind(c, name="g_application_new")
import :: c_ptr, c_char
character(kind=c_char), intent(in) :: app_id(*)
integer(c_int), value :: flags
type(c_ptr) :: g_application_new
end function g_application_new
function gtk_application_window_new(app) bind(c, name="gtk_application_window_new")
import :: c_ptr
type(c_ptr), value :: app
type(c_ptr) :: gtk_application_window_new
end function gtk_application_window_new
function gtk_builder_new() bind(c, name="gtk_builder_new")
import :: c_ptr
type(c_ptr) :: gtk_builder_new
end function gtk_builder_new
function gtk_builder_add_from_file(builder, filename, error) &
bind(c, name="gtk_builder_add_from_file")
import :: c_ptr, c_char
type(c_ptr), value :: builder
character(kind=c_char), intent(in) :: filename(*)
type(c_ptr), value :: error
integer(c_int) :: gtk_builder_add_from_file
end function gtk_builder_add_from_file
function gtk_builder_get_object(builder, name) bind(c, name="gtk_builder_get_object")
import :: c_ptr, c_char
type(c_ptr), value :: builder
character(kind=c_char), intent(in) :: name(*)
type(c_ptr) :: gtk_builder_get_object
end function gtk_builder_get_object
subroutine gtk_label_set_text(label, text) bind(c, name="gtk_label_set_text")
import :: c_ptr, c_char
type(c_ptr), value :: label
character(kind=c_char), intent(in) :: text(*)
end subroutine gtk_label_set_text
function g_signal_connect_data(instance, detailed_signal, c_handler, data, destroy_data, connect_flags) &
bind(c, name="g_signal_connect_data")
import :: c_ptr, c_int
type(c_ptr), value :: instance, c_handler, data
integer(c_int), value :: connect_flags
type(c_ptr), value :: destroy_data
integer(c_int) :: g_signal_connect_data
end function g_signal_connect_data
subroutine gtk_widget_show_all(widget) bind(c, name="gtk_widget_show_all")
import :: c_ptr
type(c_ptr), value :: widget
end subroutine gtk_widget_show_all
function g_application_run(app, argc, argv) bind(c, name="g_application_run")
import :: c_int, c_ptr
type(c_ptr), value :: app
integer(c_int), value :: argc, argv
integer(c_int) :: g_application_run
end function g_application_run
subroutine g_object_unref(obj) bind(c, name="g_object_unref")
import :: c_ptr
type(c_ptr), value :: obj
end subroutine g_object_unref
end interface
! UI元素句柄
type(c_ptr) :: app, win, builder, label
integer(c_int) :: status
! 初始化
status = gtk_init(0, 0)
! 创建应用与窗口
app = g_application_new("org.example.GtkFortran"//c_null_char, 0)
win = gtk_application_window_new(app)
! 使用GtkBuilder加载UI
builder = gtk_builder_new()
status = gtk_builder_add_from_file(builder, "window.ui"//c_null_char, c_null_ptr)
label = gtk_builder_get_object(builder, "label"//c_null_char)
! 连接信号:按钮点击 -> on_button_clicked
call g_signal_connect_data(win, "destroy"//c_null_char, c_funloc(gtk_main_quit), c_null_ptr, c_null_ptr, 0)
call g_signal_connect_data(gtk_builder_get_object(builder, "button"//c_null_char), &
"clicked"//c_null_char, c_funloc(on_button_clicked), label, c_null_ptr, 0)
! 显示界面
call gtk_widget_show_all(win)
! 运行主循环
status = g_application_run(app, 0, c_null_ptr)
! 清理
call g_object_unref(builder)
call g_object_unref(app)
contains
subroutine on_button_clicked(widget, data) bind(c)
type(c_ptr), value :: widget, data
call gtk_label_set_text(data, "按钮已被点击!"//c_null_char)
end subroutine on_button_clicked
subroutine gtk_main_quit(widget, data) bind(c)
type(c_ptr), value :: widget, data
end subroutine gtk_main_quit
end program main
三、方案二 PGPLOT 快速二维绘图(非完整GUI)
四、方案三 Winteracter 商业方案(Windows/Linux)
五、开发工具与构建建议