如何从GtkAda的GtkFileChooserButton组件中获取文件名?
附件中的代码可正常编译运行。我需要从GtkAda组件中获取并处理文件名。我了解到直接管理对象时可以实现该操作,但无法从XML文件中获取GtkFileChooserButton的文件名。恳请您提供帮助并说明实现方法,即便使用GnatStudio我也未能找到解决办法。
谢谢,Mark
解决方案
要从Glade XML定义的GtkFileChooserButton中获取文件名,核心是通过Builder对象定位到目标控件实例,再调用GtkFileChooser的标准方法获取路径。修改window_callbacks.adb中的回调函数即可实现:
修改后的window_callbacks.adb代码
-- window_callbacks.adb -- units from GtkAda with Gtk.Main; -- units from GtkAda with Gtk.File_Chooser; use Gtk.File_Chooser; with Gtk.File_Chooser_Button; use Gtk.File_Chooser_Button; -- units from Glib with Glib; use Glib; with Glib.Object; use Glib.Object; with Gtk.Widget; use Gtk.Widget; -- Ada predefined units with Ada.Text_IO; use Ada.Text_IO; with Ada.Exceptions; package body Window_Callbacks is --------------------------------- -- On_File1_File_Set -- --------------------------------- procedure On_File1_File_Set (Builder : access Gtkada_Builder_Record'Class) is Button : Gtk_File_Chooser_Button; File_Name : UTF8_String; begin -- 通过Builder获取XML中id为"file1"的控件实例 Button := Gtk_File_Chooser_Button(Get_Object(Builder, "file1")); -- 获取选中的文件名 File_Name := Get_Filename(Button); -- 输出文件名 Ada.Text_IO.Put_Line("选中的文件: " & File_Name); exception when E : others => Ada.Text_IO.Put_Line("获取文件失败: " & Ada.Exceptions.Exception_Message(E)); end On_File1_File_Set; end Window_Callbacks;
关键实现说明
- 定位控件实例:使用
Get_Object(Builder, "file1")从Builder中提取XML里定义的GtkFileChooserButton对象,再转换为对应的Ada类型。 - 获取文件路径:调用
Get_Filename方法(来自Gtk.File_Chooser包)获取选中的文件路径,返回UTF8格式字符串。 - 异常防护:添加异常捕获逻辑,避免控件获取失败或路径读取错误导致程序崩溃。
原代码问题解析
- 未通过Builder正确获取控件实例,注释中的
Gtk.File_Button.Get_File_Name是错误的API调用方式。 - 方法名拼写错误:
Gtk.File_Chooser_Button.Get_File__Name应为Get_Filename。
修改后,当你通过GtkFileChooserButton选择文件时,回调函数会自动输出选中的文件路径。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

