debian

Debian上Fortran如何进行图形界面开发

小樊
39
2025-12-06 23:45:14
栏目: 智能运维

Debian上Fortran图形界面开发路线

一、路线总览与选型

二、方案一 GTK-Fortran 原生GUI(GTK+ 3)

文件 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)

五、开发工具与构建建议

0
看了该问题的人还看了