Ubuntu上实现Fortran图形界面的常见方法
Fortran本身不直接支持图形界面开发,但可通过与C/C++图形界面库(如GTK+、FLTK)混合编程,或使用专门的Fortran图形库(如GTK-Fortran)实现。以下是具体步骤及工具推荐:
在开始前,需安装Fortran编译器、C/C++工具链及目标图形库的开发包:
gfortran
(GNU Fortran编译器),命令如下:sudo apt update sudo apt install gfortran
sudo apt install build-essential
sudo apt install libgtk-3-dev
sudo apt install libfltk1.3-dev
sudo apt install libqt5core5a libqt5gui5 libqt5widgets5 # 若需Fortran绑定,可尝试第三方库(如QtFortran,但需自行编译)
GTK+是Ubuntu下最常用的GUI库之一,通过iso_c_binding
模块实现Fortran与C的交互。以下是具体流程:
gtk_wrapper.c
):封装GTK+的C函数,供Fortran调用#include <gtk/gtk.h> #include <string.h> // 回调函数:按钮点击时触发 void on_button_clicked(GtkWidget *widget, gpointer data) { g_print("Hello from GTK!\n"); } // Fortran可调用的C接口 void start_gtk(int *argc, char ***argv, int *status) { gtk_init(argc, argv); GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "GTK+ with Fortran"); gtk_container_set_border_width(GTK_CONTAINER(window), 10); GtkWidget *button = gtk_button_new_with_label("Click Me"); g_signal_connect(button, "clicked", G_CALLBACK(on_button_clicked), NULL); gtk_container_add(GTK_CONTAINER(window), button); gtk_widget_show_all(window); *status = gtk_main(); // 进入GTK主循环 }
gtk_call.f90
):调用C包装器函数program call_gtk use iso_c_binding implicit none integer(c_int) :: argc = 1 character(kind=c_char) :: argv(10) = [c_char_"test" // c_null_char] integer(c_int) :: status ! 调用C函数启动GTK call start_gtk(c_loc(argc), c_loc(argv), c_loc(status)) print *, "GTK main returned with code ", status end program call_gtk
gcc -c gtk_wrapper.c `pkg-config --cflags gtk+-3.0` -o gtk_wrapper.o
gfortran -c gtk_call.f90 -I/usr/include/gtk-3.0 -L/usr/lib/x86_64-linux-gnu -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -pthread -o gtk_call.o
gfortran gtk_call.o gtk_wrapper.o `pkg-config --libs gtk+-3.0` -o gtk_fortran_app
./gtk_fortran_app
执行后会弹出一个包含“Click Me”按钮的窗口,点击按钮会在终端输出信息。FLTK(Fast Light Toolkit)是轻量级GUI库,适合开发简单、快速的界面。Ubuntu下可直接使用libfltk-fortran-dev
包,无需手动绑定:
sudo apt install libfltk1.3-dev libfltk-fortran-dev
fltk_gui.f90
)program simple_gui use fltk implicit none integer :: win, button, input ! 初始化FLTK call fl_open_display("") call fl_initialize() ! 创建窗口(300x200像素,标题为"FLTK GUI") win = fl_open_window(300, 200, "FLTK GUI") ! 创建文本框(位置50,50,宽度200,高度30,提示文字"Enter text:") input = fl_add_input(50, 50, 200, 30, "Enter text:") ! 创建按钮(位置100,100,宽度100,高度30,标签"Click Me") button = fl_add_button(100, 100, 100, 30, "Click Me") ! 显示窗口 call fl_show_widget(win) ! 事件循环:检查按钮点击事件 do while (fl_check_event() /= -1) if (fl_event() == FL_PUSH .and. fl_event_object() == button) then ! 获取文本框内容并显示消息框 if (trim(fl_input_value(input)) /= "") then call fl_message("You entered: " // trim(fl_input_value(input))) end if end if end do ! 关闭窗口 call fl_close_display() end program simple_gui
gfortran -o fltk_gui fltk_gui.f90 -lfltk ./fltk_gui
运行后会弹出窗口,包含文本框和按钮,点击按钮会弹出消息框显示输入的文本。
libqt5core5a
、libqt5gui5
等库实现,但需自行处理Fortran与C++的绑定(如使用extern "C"
封装C++函数),适合熟悉Qt的开发者。sudo apt install libgtk-fortran-dev
安装,参考其官方文档(如GTK-Fortran Wiki)进行开发。integer(c_int)
对应C的int
,character(kind=c_char)
对应C的char
)。-I
(头文件路径)和-L
(库文件路径)选项指定路径(如-I/usr/include/gtk-3.0
)。gtk_main()
/fl_show_widget()
)才能响应用户操作,避免在循环中阻塞主线程。通过上述方法,可在Ubuntu上实现Fortran图形界面,满足数据可视化、用户交互等需求。