Fortran图形界面开发需要系统支持图形显示,因此需先安装图形界面环境(如GNOME Desktop)。
systemctl get-default,若返回multi-user.target则表示未安装图形界面。sudo yum groupinstall "X Window System" --setopt=group_package_types=mandatory,default,optional,确认安装。sudo yum groupinstall "GNOME Desktop" "Graphical Administration Tools",完成桌面环境安装。sudo systemctl set-default graphical.target,重启系统使设置生效(sudo reboot)。gcc-gfortran(GNU Fortran编译器),执行sudo yum install gcc-gfortran。gtk3-devel包安装,执行sudo yum install gtk3-devel(部分系统需安装gtk2-devel,但GTK3更现代)。以GTK+3为例,编写一个简单的“Hello World”窗口程序(hello_gtk.f90):
program hello_gtk
use gtk
implicit none
integer :: window, button
! 初始化GTK
call gtk_init(0, null_ptr)
! 创建顶层窗口
window = gtk_window_new(GTK_WINDOW_TOPLEVEL)
call gtk_window_set_title(GTK_WINDOW(window), "Fortran GTK+ Example")
call gtk_window_set_default_size(GTK_WINDOW(window), 300, 200)
! 绑定窗口关闭事件(退出主循环)
call g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), window)
! 创建按钮
button = gtk_button_new_with_label("Click Me!")
! 绑定按钮点击事件(打印消息)
call g_signal_connect(button, "clicked", G_CALLBACK(on_button_clicked), window)
! 将按钮添加到窗口
call gtk_container_add(GTK_CONTAINER(window), button)
! 显示所有控件
call gtk_widget_show_all(window)
! 进入GTK主循环
call gtk_main()
end program hello_gtk
subroutine on_button_clicked(widget, data)
use gtk
implicit none
integer :: widget, data
! 打印点击消息到控制台
print *, "Button clicked!"
end subroutine on_button_clicked
说明:程序通过gtk_init初始化GTK,创建窗口和按钮,通过g_signal_connect绑定事件(如窗口关闭、按钮点击),最后进入gtk_main主循环等待用户交互。
gfortran编译,通过pkg-config自动获取GTK+的编译选项和库链接路径,命令如下:gfortran -o hello_gtk hello_gtk.f90 `pkg-config --cflags --libs gtk+-3.0`
参数说明:--cflags获取GTK+的头文件路径(如-I/usr/include/gtk-3.0),--libs获取库链接选项(如-lgtk-3 -lgdk-3)。./hello_gtk,将弹出标题为“Fortran GTK+ Example”的窗口,点击按钮会在终端打印“Button clicked!”。gobject-2.0),需安装对应开发包(sudo yum install glib2-devel)。G_CALLBACK绑定Fortran子程序,子程序需使用use iso_c_binding模块以兼容C接口。GtkBox、GtkGrid)和更多控件(如标签、文本框)扩展界面功能,参考GTK+官方文档或gtk-fortran的示例代码。通过以上步骤,即可在CentOS上使用Fortran开发简单的图形界面程序。如需更复杂的功能(如3D绘图),可结合OpenGL库(mesa-libGL-devel)或第三方工具(如wxWidgets、Qt),但需额外安装对应开发包并处理Fortran与C++的绑定问题。