如何从GtkAda获取颜色?

问题描述 投票:0回答:1

所附代码编译并运行。

$ ./xml_code XML 加载正常

(xml_code:31196):Gtk-CRITICAL **:22:24:59.048:gtk_color_chooser_get_rgba:断言“GTK_IS_COLOR_CHOOSER(选择器)”失败 红色:0.00000000000000E+00 绿色:6.64864036484338E-310 蓝色:6.95298171953014E-310 阿尔法:6.64864036156160E-310

(xml_code:31196):Gtk-CRITICAL **:22:25:02.163:gtk_color_chooser_get_rgba:断言“GTK_IS_COLOR_CHOOSER(选择器)”失败 红色:0.00000000000000E+00 绿色:6.64864036484338E-310 蓝色:6.95298171953014E-310 阿尔法:6.64864036156160E-310 ^C $

但我无法检索用户输入的颜色。 事实上,我不知道如何加载window_callbacks.adb文件中的“procedure On_Color1_Color_Set”过程中“Self”变量的值。 我找不到加载变量的正确方法。也许这是来自 GtkAda 的问题,因为 C 代码运行正确,我不知道? 谢谢 马克

--=- xml_code.adb -=-    
-- units from Gtk
with Gtk.Main;
with Glib.Error;     use Glib.Error;
with Gtk.Widget;     use Gtk.Widget;
with Gtk.Builder;    use Gtk.Builder;
with Gtkada.Builder; use Gtkada.Builder;

-- Ada predefined units
with Ada.Text_IO;    use Ada.Text_IO;
with Ada.Exceptions;

-- Application specific units
with Window_Callbacks; use Window_Callbacks;

procedure XML_Code is

  Builder         : Gtkada_Builder;
  Error           : aliased Glib.Error.GError;

  -- xml / Glade
  Mon_Interface   : Constant String := "<?xml version=""1.0"" encoding=""UTF-8""?>"
& "<!-- Generated with glade 3.40.0 -->"
& "<interface>"
& "  <requires lib=""gtk+"" version=""3.24""/>"
& "  <object class=""GtkAdjustment"" id=""adjustment1"">"
& "    <property name=""upper"">100</property>"
& "    <property name=""step-increment"">1</property>"
& "    <property name=""page-increment"">10</property>"
& " </object>"
& " <object class=""GtkListStore"" id=""liststore1"">"
& "    <columns>"
& "      <!-- column-name Col_1 -->"
& "      <column type=""gchararray""/>"
& "    </columns>"
& "    <data>"
& "      <row>"
& "        <col id=""0"">Ligne-1</col>"
& "      </row>"
& "      <row>"
& "        <col id=""0"">bbb</col>"
& "      </row>"
& "      <row>"
& "        <col id=""0"">dddd</col>"
& "      </row>"
& "      <row>"
& "        <col id=""0"">eeeeeeee</col>"
& "      </row>"
& "      <row>"
& "        <col id=""0"">ligne-5</col>"
& "      </row>"
& "      <row>"
& "        <col id=""0"">ligne-6</col>"
& "      </row>"
& "    </data>"
& "  </object>"
& "  <object class=""GtkWindow"" id=""window"">"
& "    <property name=""name"">window</property>"
& "    <property name=""width-request"">89</property>"
& "    <property name=""height-request"">3</property>"
& "    <property name=""can-focus"">False</property>"
& "    <property name=""hexpand"">True</property>"
& "    <property name=""vexpand"">True</property>"
& "    <property name=""border-width"">0</property>"
& "    <property name=""window-position"">center</property>"
& "    <property name=""gravity"">center</property>"
& "    <child>"
& "      <object class=""GtkFixed"" id=""fixed1"">"
& "        <property name=""name"">fixed1</property>"
& "        <property name=""visible"">True</property>"
& "        <property name=""can-focus"">False</property>"
& "        <child>"
& "          <object class=""GtkColorButton"" id=""color1"">"
& "            <property name=""width-request"">100</property>"
& "            <property name=""height-request"">33</property>"
& "            <property name=""visible"">True</property>"
& "            <property name=""can-focus"">True</property>"
& "            <property name=""receives-default"">True</property>"
& "            <signal name=""color-set"" handler=""on_color1_color_set"" swapped=""no""/>"
& "          </object>"
& "          <packing>"
& "            <property name=""x"">298</property>"
& "            <property name=""y"">303</property>"
& "          </packing>"
& "        </child>"
& "      </object>"
& "    </child>"
& "  </object>"
& "</interface>";

  use type Glib.Guint;
     
  begin

    Gtk.Main.Init;

    Gtk_New (Builder);
    if Add_From_String (Gtk_Builder(Builder), Mon_Interface, Error'Access) = 0 then
      Put_Line ("Error : " & Get_Message (Error));
      Error_Free (Error);
      return;
    end if;
    Put_Line ("Loading of XML is OK ");

    Register_Handler (Builder, "on_window1_delete_event", On_Window1_Delete_Event'Access);

    Register_Handler (Builder, "on_color1_color_set",     On_Color1_Color_Set'Access);

    Do_Connect (Builder);

    Show_All (Gtk_Widget (Get_Object (GTK_Builder (Builder), "window")));

    Gtk.Main.Main;

    Unref (Builder);

  end XML_Code;
 

--=- window_callbacks.ads -=-
with Gtkada.Builder; use Gtkada.Builder;

package Window_Callbacks is

  function On_Window1_Delete_Event (Builder : access Gtkada_Builder_Record'Class) return Boolean;  --Ajout
  Procedure On_Color1_Color_Set    (Builder : access Gtkada_Builder_Record'Class);

end Window_Callbacks;


--=- window_callbacks.adb --=--    
-- units from GtkAda
with Gtk.Main;

with Gtk.Color_Chooser;           use Gtk.Color_Chooser;
with Gdk.RGBA;                    use Gdk.RGBA;

-- units from Glib
with Glib;              use Glib;

-- Ada predefined units
with Ada.Text_IO;       use Ada.Text_IO;


package body Window_Callbacks  is

  -----------------------------------------------
  -- On_Window1_Delete_Event
  -----------------------------------------------
  function On_Window1_Delete_Event 
                 (Builder : access Gtkada_Builder_Record'Class) return Boolean is
    pragma Unreferenced (Builder); -- C'est sciemment que Builder n'est pas utilisé dans la fonction
    begin
      Gtk.Main.Main_Quit;
      return False;
    end On_Window1_Delete_Event;

  ---------------------------------
  -- On_Color1_Color_Set  --
  ---------------------------------
  procedure On_Color1_Color_Set (Builder : access Gtkada_Builder_Record'Class) is
    pragma Unreferenced (Builder);

    Self  : Gtk_Color_Chooser;
    Color : Gdk_RGBA;
    begin
    
      Gtk.Color_Chooser.Get_RGBA (Self, Color);
    
      put_line ("Red : "   &  Gdouble'Image (Color.Red));
      put_line ("Green : " &  Gdouble'Image (Color.Green));     
      put_line ("Blue : "  &  Gdouble'Image (Color.Blue));    
      put_line ("Alpha : " &  Gdouble'Image (Color.Alpha));
    
    end On_Color1_Color_Set;

end Window_Callbacks;
gtk ada glade gtkada
1个回答
0
投票

问题在于,在On_Color1_Color_Set中,self只是一个空值。 Gtk_Color_Chooser 已关闭,因此无法访问它。 您唯一可以使用的是按钮 Color1。

首先,将 Color_Button 的声明添加到

with
语句中

with Gtk.Color_Button; use Gtk.Color_Button;
with Gtk.Widget;       use Gtk.Widget;

Gtk.Color_Chooser 可以删除。 在回调中

procedure On_Color1_Color_Set(builder: access Gtkada_Builder_Record'Class) is
   self: Gtk_Color_Button;
   widget: Gtk_Widget;
   rgba: Gdk_RGBA;
begin
   -- This can all be done in one statement but it 
   -- is more difficult to track in the debugger
   widget := Gtk_Widget(builder.Get_Object("color1"));
   -- Get the color button
   self := Gtk_Color_Button(widget);
   -- Get the RGBA value from the button
   Gtk.Color_Button.Get_RGBA(self, rgba);

   -- Convert RGBA to a string
   declare
       color: constant String := To_String(rgba);
   begin
       Put_Line(color);

       -- RGB values in floating point format
       Put_Line("Red   " & rgba.red'image);
       Put_Line("Green " & rgba.green'image);
       Put_Line("Blue  " & rgba.blue'image);
       Put_Line("Alpha " & rgba.alpha'image);
   end;
end On_Color1_Color_Set;
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.