به محض آشنایی با Gtk تا در مورد Glade میشنیدم، آن را «بدرد نخور» میدانستم. دلیل این طرز تفکر من هم فقط به خاطر تاثیر آن در کاهش سرعت اجرا بود. زیرا Glade بصورت یک لایه بر بالای Gtk عمل میکند. اما طرز تفکر من اشتباه بود، مزایای Glade بیش از معایت آن است.Glade چیست؟ برنامهای است برای برنامهنویسان Gtk که به وسیلهی آن بدون نیاز به کدنویسی میتوان در کوتاهترین زمان ممکن، یک پنجره را طراحی کرد. همه چیز در Glade انجام میشود. حتی برای اتصال توابع به سیگنالها، باز هم نیازی به کدنویسی ندارید و به کمک Glade میتوانید این کار را انجام دهید! نتایج کار در یک فایل با پسوند glade و در قالب XML ذخیره میشود.
چطور از Glade در برنامههایمان استفاده کنیم؟ در برنامهی Glade، پس از طراحی پنجره و اتصال توابع به سیگنالها، و ذخیرهسازی نتایج کار در فایلی با پسوند glade، از این به بعد ادامهی کار را کتابخانهی Glade بر عهده خواهد گرفت. وظیفهی کتابخانهی Glade، خواندن فایلهایی با پسوند glade است که توسط برنامهی Glade ایجاد شدهاند؛ یعنی کتابخانهی Glade در زمان اجرای برنامه، از روی محتویات فایل glade شروع به ساختن پنجره میکند. به کدهای زیر دقت کنید:
#include <gtk/gtk.h>
#include <glade/glade.h>
int main (int argc, char* argv[])
{
GladeXML *xml;
gtk_init (&argc, &argv);
xml = glade_xml_new ("interface.glade", NULL, NULL);
glade_xml_signal_autoconnect (xml);
gtk_main ();
return 0;
}
.
کدهای بالا مربوط به سورس یک برنامه است که با زبان C نوشته شده است. در اصل، همهی کار در خط هفتم و توسط تابع glade_xml_new صورت گرفته است، در این خط، کتابخانهی Glade بر اساس محتویات فایل interface.glade شروع به ایجاد پنجرهی Gtk میکند و برای دسترسی به اجزای این پنجره، اشارهگری را در متغیر xml قرار میدهد. از این به بعد، هر کاری که با پنجره یا ویدجتهای درون آن داشتید را از طریق متغیر xml انجام خواهید داد. در خط هشتم و توسط تابع glade_xml_signal_autoconnect همهی توابعی که توسط برنامهی Glade به سیگنالها متصل کرده بودیم را به سیگنالهایشان متصل میکند.
بهتر است پس از خواندن مطالب قبل، یک مثال عملی را با هم انجام دهیم، در ادامه بصورت قدم به قدم با هم آن را انجام خواهیم داد:
برنامهی Glade را اجرا کنید. از پنل سمت چپ و در قسمت Toplevels بر روی آیکن Window کلیک کنید تا یک پنجرهی خالی برای ظاهر برنامه، در نظر گفته شود. از پنل سمت راست و در قسمت Properties، زبانهی Common را انتخاب کنید، در این قسمت در جلوی گزینه Visible مقدار No نوشته شده است، بر روی دکمهی No کلیک کنید تا مقدار Yes برای گزینهی Visible در نظر گرفته شود. با انجام این کار، پنجره بطور پیشفرض نمایش داده خواهد شد. از پنل سمت راست و در قسمت Properties، زبانهی General را انتخاب کنید، در این قسمت میتوانید خاصیتهای مختلف را مقداردهی کنید. توجه کنید مقداری که برای گزینهی Name در نظر میگیرید، نامی است که توسط آن میتوانید از طریق کد، به شیئ پنجره دسترسی داشته باشید. در اینجا همان نام window1 را بدون تغییر بگذارید. از پنل سمت راست و در قسمت Properties، زبانهی Signals را انتخاب کنید، در این قسمت گزینهی GtkWidget را باز کرده و سپس در جلوی گزینهی delete_event، مقدار on_window1_delete_event را از لیست انتخاب کنید. با انجام این کار، پس از بستن پنجره، تابع on_window1_delete_event اجرا خواهد شد و به عبارتی، تابع on_window1_delete_event به سیگنال delete_event (بستن پنجره) متصل میشود.از پنل سمت چپ و در قسمت Containers بر روی آیکن Horizontal Box کلیک کنید و سپس بر روی پنجرهی خالی کلیک کنید تا یک جعبهی بستهبندی افقی در پنجره اضافه شود. مقدار ۲ را انتخاب کنید تا تنها ۲ سلول (یا خانه) وجود داشته باشد. از پنل سمت چپ و در قسمت Control and Display بر روی آیکن Label کلیک کنید و سپس بر روی خانهی سمت چپ بر روی پنجره کلیک کنید تا یک برچسب در سمت چپ پنجره قرار گیرد. از پنل سمت چپ و در قسمت Control and Display بر روی آیکن Text Entry کلیک کنید و سپس بر روی خانهی سمت راست بر روی پنجره کلیک کنید تا یک ورودی متن در سمت راست پنجره و در کنار برچسب قرار گیرد. در انتها، از منوی File گزینه Save را انتخاب کرده و نتایج کار را در فایلی به نام interface.glade در دایرکتوری خانگی ذخیره کنید. برنامهی Glade را ببندید.
یک فایل به نام main.c را در دایرکتوری خانگی و در کنار فایل interface.glade ایجاد کنید و آن را برای ویرایش باز کنید. کدهای زیر را در آن بنویسید:
#include <gtk/gtk.h>
#include <glade/glade.h>
gboolean on_window1_delete_event (GtkWidget* widget, GdkEvent* event, gpointer user_data)
{
gtk_main_quit ();
}
int main (int argc, char* argv[])
{
GladeXML *xml;
gtk_init (&argc, &argv);
xml = glade_xml_new ("interface.glade", NULL, NULL);
glade_xml_signal_autoconnect (xml);
gtk_main ();
return 0;
}
.
ترمینال را باز کرده و به دایرکتوری خانگی بروید، دستور زیر را وارد کنید:
$ gcc -export-dynamic -o main main.c $(pkg-config --cflags --libs libglade-2.0) && ./main
.
با اجرای این دستور، کدهای فایل main.c کامپایل شده و برنامهای به نام main تولید میشود، سپس این برنامه اجرا خواهد شد.
در صورتی که میخواهید به شیئ از پنجره دسترسی داشته باشید، از تابع glade_xml_get_widget استفاده کنید، بطور مثال در کدهای فایل main.c که در بالا نوشته شده، میتوانید بعد از صدا زدن تابع glade_xml_new خط زیر رابرای دسترسی به شیئ پنجره اضافه کنید:
GtkWidget* window1 = glade_xml_get_widget (xml, "window1");
در این صورت هر جا که خواستید به پنجره دسترسی داشته باشید، میتوانید از متغیر window1 استفاده کنید، به طور مثال میتوانید عنوان پنجره را تغییر دهید:
gtk_window_set_title (GTK_WINDOW (window1), "Window title is changed.");
همانطور که میبینید، استفاده از Glade دارای مزایایی است، از جمله؛ جداسازی رابط کاربری از کدهای محاسباتی برنامه، طراحی سریع و آسان ظاهر برنامه، ایجاد تغییر در رابط کاربری بدون نیاز به تغییر در کدها و استفاده از ظاهر برنامه در زبانهای مختلف برنامهنویسی بدون نیاز به تغییر در فایل glade. اما در مقابل یک ایراد بسیار کوچک نیز دارد که قابل صرف نظر است و آن این است که فقط در حین ایجاد پنجره در زمان اجرا، کمی کاهش سرعت (نامحسوس) را در پی خواهد داشت ولی پس از ایجادشدن پنجره، کاهش سرعتی وجود نخواهد داشت.