如何修复“ Gtk-CRITICAL **:00:18:45.249:gtk_widget_queue_draw_area:断言'GTK_IS_WIDGET(widget)'失败”

时间:2018-11-22 22:58:27

标签: c gtk3 cairo glade

我正在使用Glade编写GTK3 C程序,当按下按钮时,它将绘制矩形。它绘制矩形,但存在问题。

当调用矩形绘图函数时,我在终端中得到了这个

(Logika.run:8416): Gtk-CRITICAL **: 00:30:59.112: gtk_widget_queue_draw_area: assertion 'GTK_IS_WIDGET (widget)' failed

有直观的问题表示形式(我只单击了一次)(抱歉,每秒帧数太低) There is visual representation of the problem (I only clicked once) (sorry for low fps) 如您所见,它绘制了一个矩形,但是延迟很大。

我已经找到问题到“ gtk_widget_queue_draw_area”,但是我不知道如何解决。当我在没有Glade的情况下使用此代码时,它可以正常工作。代码中充满了其他内容(例如计时器),因此请忽略这些部分。请注意“开罗抽奖内容”。 有C代码:

#include <gtk/gtk.h>


#include <string.h>
#include <stdio.h>
#include <math.h>



//==============================================================Timer=stuff==================================================================================
unsigned char isTimerRunning = 0;
int tempx = 0;
int tempy = 0;




gint TimerCallback (gpointer data)
{



    if (isTimerRunning == 1)
    {

        g_print("Timer click\n");

        //timer test
        if (tempx > 1300)
        {
            tempx = 0;
            tempy = tempy + 5;

        }
        //draw_brush (DrawArea, tempx, tempy);
        //draw_rectangle (DrawArea, tempx, tempy, 5, 5, 0.5, 0.5, 0);
        tempx = tempx + 5;
        //tempy = tempy + 5;








        return 1;
    } else
    {
        return 0;
    }

}

void StartTimer ()
{
    if (isTimerRunning == 0)
    {
        isTimerRunning = 1;
        g_timeout_add (100, TimerCallback, NULL);  //17 = 60fps

    }

}

void StopTimer ()
{
    isTimerRunning = 0;
}




//=======================================================================


//====================Cairo=Draw=stuff============================
static cairo_surface_t *surface = NULL;
GtkWidget *MainDrawArea;

static void clear_surface (void)
{
  cairo_t *cr;

  cr = cairo_create (surface);

  cairo_set_source_rgb (cr, 1, 1, 1);
  cairo_paint (cr);

  cairo_destroy (cr);
}

/* Create a new surface of the appropriate size to store our scribbles */
gboolean configure_event_cb (GtkWidget *widget,GdkEventConfigure *event, gpointer data)
{
  if (surface)
    cairo_surface_destroy (surface);

  surface = gdk_window_create_similar_surface (gtk_widget_get_window (widget),
                                               CAIRO_CONTENT_COLOR,
                                               gtk_widget_get_allocated_width (widget),
                                               gtk_widget_get_allocated_height (widget));

  /* Initialize the surface to white */
  clear_surface ();

  /* We've handled the configure event, no need for further processing. */
  return TRUE;
}

/* Redraw the screen from the surface. Note that the ::draw
 * signal receives a ready-to-be-used cairo_t that is already
 * clipped to only draw the exposed areas of the widget
 */
gboolean draw_cb (GtkWidget *widget, cairo_t *cr, gpointer data)
{
  cairo_set_source_surface (cr, surface, 0, 0);
  cairo_paint (cr);

  return FALSE;
}

/* Draw a rectangle on the surface at the given position */
static void draw_brush (GtkWidget *widget, gdouble x, gdouble y)
{
  cairo_t *cr;

  /* Paint to the surface, where we store our state */
  cr = cairo_create (surface);

  cairo_rectangle (cr, x - 3, y - 3, 6, 6);
  cairo_fill (cr);

  cairo_destroy (cr);

  /* Now invalidate the affected region of the drawing area. */
  gtk_widget_queue_draw_area (widget, x - 3, y - 3, 6, 6);
}



//========================




int main(int argc, char *argv[])
{
    GtkBuilder      *builder; 
    GtkWidget       *window;

    gtk_init(&argc, &argv);

    builder = gtk_builder_new();
    gtk_builder_add_from_file (builder, "Resources/GUI_design.glade", NULL);

    window = GTK_WIDGET(gtk_builder_get_object(builder, "window_main"));
    gtk_builder_connect_signals(builder, NULL);

    g_object_unref(builder);



    //g_signal_connect (gl_area, "render", G_CALLBACK (render), NULL);




    gtk_widget_show(window);                
    gtk_main();

    return 0;
}

// called when window is closed
void on_window_main_destroy()
{
    gtk_main_quit();
}


void TestButton_clicked()
{
    g_print("Test button is pressed\n");

    //draw_rectangle (DrawArea, 50, 50, 20, 20, 0.5, 0.5, 0);
    //draw_callback(DrawArea,cr2);
    draw_brush (MainDrawArea, 100, 100);





}

void Debug_startTimer_activate()
{
    g_print("Timer start\n");
    StartTimer ();
}

void Debug_stopTimer_activate()
{
    g_print("Timer stop\n");
    StopTimer ();
}





gboolean Test_event ()
{
    g_print("Test Event\n");
    //printf ("print f test", 20);
    //sprintf("print f test ", "%d", event->x);
    //Test_event


}

//Reģistrē peles klikšķi
gboolean button_press_event_cb (GtkWidget *widget, GdkEventButton *event, gpointer data)
//gboolean button_press_event_cb (GdkEventButton *event)
{

    printf("[Click] Mouse X: %f\n", event->x);
    printf("[Click] Mouse Y: %f\n", event->y);

    return TRUE;



}

//Reģistrē peles kustību
gboolean motion_notify_event_cb (GtkWidget *widget, GdkEventMotion *event, gpointer data)
{
    printf("[Move] Mouse X: %f\n", event->x);
    printf("[Move] Mouse Y: %f\n", event->y);

    return TRUE;
}

刀片设计代码:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
  <requires lib="gtk+" version="3.20"/>
  <object class="GtkImage" id="NOT_gate_image">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <property name="pixbuf">Standard_gates_images/Not_gate.png</property>
  </object>
  <object class="GtkPopover" id="StandartGatesChooseButton_popover1">
    <property name="can_focus">False</property>
    <child>
      <object class="GtkBox" id="StandartGatesChooseButton_popover1_box">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkButton">
            <property name="label" translatable="yes">Not vārti</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <property name="image">NOT_gate_image</property>
            <property name="always_show_image">True</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton">
            <property name="label" translatable="yes">OR vārti</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton">
            <property name="label" translatable="yes">AND vārti</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">2</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
  <object class="GtkImage">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <property name="stock">gtk-missing-image</property>
  </object>
  <object class="GtkImage">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <property name="stock">gtk-missing-image</property>
  </object>
  <object class="GtkWindow" id="window_main">
    <property name="can_focus">False</property>
    <property name="title" translatable="yes">Logika komponentu simulators</property>
    <property name="default_width">1920</property>
    <property name="default_height">1080</property>
    <property name="icon">icon.png</property>
    <signal name="destroy" handler="on_window_main_destroy" swapped="no"/>
    <child type="titlebar">
      <placeholder/>
    </child>
    <child>
      <object class="GtkBox" id="MainBox">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkMenuBar" id="MenuBar">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <child>
              <object class="GtkMenuItem">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="label" translatable="yes">_Datne</property>
                <property name="use_underline">True</property>
                <child type="submenu">
                  <object class="GtkMenu">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <child>
                      <object class="GtkImageMenuItem">
                        <property name="label">imagemenuitem</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="image">__glade_unnamed_27</property>
                        <property name="use_stock">False</property>
                      </object>
                    </child>
                    <child>
                      <object class="GtkImageMenuItem">
                        <property name="label">gtk-open</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_underline">True</property>
                        <property name="use_stock">True</property>
                      </object>
                    </child>
                    <child>
                      <object class="GtkImageMenuItem">
                        <property name="label">gtk-save</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_underline">True</property>
                        <property name="use_stock">True</property>
                      </object>
                    </child>
                    <child>
                      <object class="GtkImageMenuItem">
                        <property name="label">gtk-save-as</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_underline">True</property>
                        <property name="use_stock">True</property>
                      </object>
                    </child>
                    <child>
                      <object class="GtkSeparatorMenuItem">
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                      </object>
                    </child>
                    <child>
                      <object class="GtkImageMenuItem">
                        <property name="label">gtk-quit</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_underline">True</property>
                        <property name="use_stock">True</property>
                      </object>
                    </child>
                  </object>
                </child>
              </object>
            </child>
            <child>
              <object class="GtkMenuItem">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="label" translatable="yes">R_ediģēt</property>
                <property name="use_underline">True</property>
                <child type="submenu">
                  <object class="GtkMenu">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <child>
                      <object class="GtkImageMenuItem">
                        <property name="label">gtk-cut</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_underline">True</property>
                        <property name="use_stock">True</property>
                      </object>
                    </child>
                    <child>
                      <object class="GtkImageMenuItem">
                        <property name="label">gtk-copy</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_underline">True</property>
                        <property name="use_stock">True</property>
                      </object>
                    </child>
                    <child>
                      <object class="GtkImageMenuItem">
                        <property name="label">gtk-paste</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_underline">True</property>
                        <property name="use_stock">True</property>
                      </object>
                    </child>
                    <child>
                      <object class="GtkImageMenuItem">
                        <property name="label">gtk-delete</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_underline">True</property>
                        <property name="use_stock">True</property>
                      </object>
                    </child>
                  </object>
                </child>
              </object>
            </child>
            <child>
              <object class="GtkMenuItem">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="label" translatable="yes">_Skats</property>
                <property name="use_underline">True</property>
              </object>
            </child>
            <child>
              <object class="GtkMenuItem">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="label" translatable="yes">_Palīdzība</property>
                <property name="use_underline">True</property>
                <child type="submenu">
                  <object class="GtkMenu">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <child>
                      <object class="GtkImageMenuItem">
                        <property name="label">gtk-about</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_underline">True</property>
                        <property name="use_stock">True</property>
                      </object>
                    </child>
                  </object>
                </child>
              </object>
            </child>
            <child>
              <object class="GtkMenuItem" id="Debug">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="label" translatable="yes">Debug</property>
                <child type="submenu">
                  <object class="GtkMenu">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <child>
                      <object class="GtkImageMenuItem">
                        <property name="label">Start timer</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_stock">False</property>
                        <signal name="activate" handler="Debug_startTimer_activate" swapped="no"/>
                      </object>
                    </child>
                    <child>
                      <object class="GtkImageMenuItem">
                        <property name="label">Stop timer</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_stock">False</property>
                        <signal name="activate" handler="Debug_stopTimer_activate" swapped="no"/>
                      </object>
                    </child>
                  </object>
                </child>
              </object>
            </child>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkPaned" id="MainPaned">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="orientation">vertical</property>
            <property name="position">900</property>
            <property name="position_set">True</property>
            <child>
              <object class="GtkEventBox" id="GtkDrawingArea_EventBox">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <signal name="button-press-event" handler="button_press_event_cb" swapped="no"/>
                <signal name="motion-notify-event" handler="motion_notify_event_cb" swapped="no"/>
                <child>
                  <object class="GtkDrawingArea" id="MainDrawArea">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <signal name="configure-event" handler="configure_event_cb" swapped="no"/>
                    <signal name="draw" handler="draw_cb" swapped="no"/>
                  </object>
                </child>
              </object>
              <packing>
                <property name="resize">True</property>
                <property name="shrink">True</property>
              </packing>
            </child>
            <child>
              <object class="GtkBox" id="ControlBox">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="spacing">5</property>
                <property name="homogeneous">True</property>
                <child>
                  <object class="GtkMenuButton" id="StandartGatesChooseButton">
                    <property name="label" translatable="yes">Standarta vārti</property>
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="receives_default">True</property>
                    <property name="direction">up</property>
                    <property name="popover">StandartGatesChooseButton_popover1</property>
                    <child>
                      <placeholder/>
                    </child>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="fill">True</property>
                    <property name="position">0</property>
                  </packing>
                </child>
                <child>
                  <object class="GtkButton" id="TestButton">
                    <property name="label" translatable="yes">button</property>
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="receives_default">True</property>
                    <signal name="clicked" handler="TestButton_clicked" swapped="no"/>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="fill">True</property>
                    <property name="position">1</property>
                  </packing>
                </child>
              </object>
              <packing>
                <property name="resize">False</property>
                <property name="shrink">False</property>
              </packing>
            </child>
          </object>
          <packing>
            <property name="expand">True</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
  <object class="GtkImage">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <property name="stock">gtk-missing-image</property>
  </object>
</interface>

0 个答案:

没有答案