⑴ gtk程序能直接運行在linux開發板上嗎
在開發板上要有gtk的庫,然後交叉編譯你寫的gtk程序,放到開發板上,應該就可以運行了
⑵ windows下配置GTK環境開發出來的程序。可以運行在win還是linux下。。
c/c++這些編譯語言要跨系統必須重新編譯
另外,非ANSI C部分,系統API部分需要重寫
java這些解釋語言寫的東西可以隨意跨平台,由於有統一向上介面的中間層存在,所以只要個平台都有其虛擬機(運行環境),就可以運行
⑶ 如何在windows xp系統下使用gtk 誰會就請給出詳細步驟
遇到問題,相關軟體的官網是第一選擇,搜索引擎其次,圖書館往往最浪費時間。
http://www.gtk.org/download-windows.html
以上網頁第一段的意思是:為了編譯GTK+程序,需要安裝GLib、cairo、Pango、ATK、gdk-pixbuf和GTK+這些開發包(就是GTK+ indivial packages標題下Dev列的內容,其中GTK+提供了兩個版本,只需要一個就可以了);為了運行GTK+程序,需要安裝GLib、cairo、Pango、ATK、gdk-pixbuf和GTK+的運行庫(就是GTK+ indivial packages標題下Run-time列的內容),以及gettext-runtime、fontconfig、freetype、expat、libpng和zlib(就是Required third party dependencies標題下Run-time列的內容)。
如果要編程,What toolchain to use?標題下的內容最好也看一下。
寫Windows下的GTK+程序還有個選擇:http://ricardo.ecn.wfu.e/~cottrell/cross-gtk/。
總結一下:只是在Windows下運行GTK+程序,則安裝GLib、cairo、Pango、ATK、gdk-pixbuf、GTK+、gettext-runtime、fontconfig、freetype、expat、libpng和zlib的運行庫(就是Run-time列的內容)就行了(如果你很清楚這里某個組件是用不到的,不裝也行)。
如果是在Windows下寫GTK+程序,就把我前面提到的編譯和運行需要的內容都裝上(編程過程中需要調試吧!)。
想深入一點,http://www.gtk.org/documentation.html是要看一下的。想深深地陷入GTK+,那還是把Windows休了吧。
⑷ linux下的gtk是什麼有什麼用
GTK(GIMP Toolkit)是一個Linux平台下基於Xwindow圖形窗口的圖形用戶編程介面工具,可以藉助它來開發Linux平台下基於Xwindow的圖形用戶界面。通俗點講,和java中的swing圖形開發工具包類似.它注冊完全免費,所以用來開發自由軟體或商業軟體都不需要花費什麼。現在很多Linux集成系統都已經將GTK1.2版本打包進去了。包括RedHat Linux 6.0以上版本,還有中文化的Turbo Linux等等。它也越來越被普遍的應用於UNIX系統編程.
⑸ 在windows下寫的GTK程序拿到LINUX下編譯一下能不能在LINUX下使用
當然可以,只要你所調用的函數不是windows下才有的。不過既然是純粹的GTK程序,應該沒問題,不會有win32 api,GTK可是linux下原生的圖形系統,可能有細微的差別,因為我沒用過。
你可以試一試,有了問題再google。如果說答案,只有一個,那就是肯定能。
⑹ 如何在linux下用gtk開發圖形界面應用程序
* 使用 GTK+ 和 Glade 快速開發 Linux 圖形界面
** GTK+ 簡介
*** 基本概念
GTK+ 是一種用於創建圖形界面的庫. 嗯, gnome 用的就是它, 不過並不是說只
有在 gnome 環境中才能用, 只要系統上裝有 GTK 的庫 (基本上有圖形系統的個
人機都會有的啦) 就能運行基於 GTK 的程序. 除了 UNIX-like 平台, 它還移植
到 windows 上, 還有面向嵌入設備的 framebuffer 版本等等.
GTK 依賴兩個重要的庫. 一個是 GLib, 這並不是一個圖形庫, 也和 glibc 不同
, 它大抵上提供了一些介面以屏蔽系統的不同, 比如 gint 在哪裡都是 32bit
的, 等等; 另一個是 GDK, 它是一個設備無關的圖形庫, 支持基本的畫點, 以及
與窗口管理器溝通等任務, 由於 GTK 被設計成能在各個平台, 而非僅僅在
XWindow 環境下使用, 所以這個庫也是必要的. 而在他們上面的 GTK 庫, 就提
供了一些 widget --- 可以理解為控制項啦, 不過窗口也是一個 widget 的說, 給
我們使用, 並提供了包裝良好的事件響應機制.
*** GTK+ 開發基礎
要開發基於 GTK 的軟體, 必須先安裝 GTK+ 的開發包. 檢查是否正確安裝的辦
法是在安裝後執行 ``pkg-config --cflags --libs gtk+-2.0'', 如果安裝不正
確, 會提示找不到相應的包.
GTK 本身是基於 C 的庫, 當然也有 C++ 等語言的 wrap, 但它的整個體系是面
向對象的. 其最基本的類是 GObject, GtkObject 繼承了它, GtkObject 又派生
出我們最經常用到的 GtkWidget, 我們使用的所有窗體控制項都派生於它. 於是,
在 C 環境中我們就要手動處理這些類轉換, GTK 和底層的 GLib 等提供了一種
統一的轉換方法, 比如把類型為 GtkWidget* 的 button 轉換成 GtkButton 形,
寫法是: GTK_BUTTON(button), 就醬子.
我不打算在這里列一個 GTK 的 hello world 占頁面, 這個程序隨便 google 一
下就能找到. 我們可以自己想一想一個圖形界面應該如何建立.
首先我們要進行初始化, GTK 提供了 gtk_init() 作為初始化, 它檢查程序參數
中的一些特定部分, 進行自己的設置. 調用方法如下:
gtk_init(&argc, &argv);
將 argc 和 argv 傳指針的目的是 gtk_init 會對他們進行加工, 把 GTK 自己
用到的一些參數抽取出來.
接著, 我們必須要創建這些控制項吧, GTK 中, 創建一個控制項會返回一個
GtkWidget 類型 (或它的派生類) 的指針, 所有創建控制項的函數的格式是
gtk_控制項類型_new(參數表). 比如創建一個窗口的寫法是:
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
然後, 我們要設定事件響應函數, GTK 中的事件叫做 signal. GTK 的事件響應
函數介面應該是類似這樣的
void
destroy(GtkWidget *widget, gpointer data)
我們把它連入到一個控制項中的方法是這樣的
g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(destroy), NULL);
應該很好理解吧.
我們創建的咚咚, 要說明他們的位置和包含關系, GTK 用 container 來解決這
個問題, 它可以保證在窗口縮放的時候控制項的擺放依然合理, container 的具體
使用不詳細說, 後面經常要跟 container 打交道, 但基本上不用管 C 代碼, 嗯
. 不過其實我們的任何的可視控制項都繼承自 container, 比如 button 也是一個
container, 它很多時候裝的是一個 GtkLabel, 也就是用來顯示純文本的控制項,
於是我們就能見到一個文本按鈕, 嗯. 使用 container 的方法如下.
gtk_container_add(GTK_CONTAINER(window), button);
這樣 button 就會占滿整個 window 的控制項, 我們後面可以看到可以用
GtkVBox, GtkHBox 等 container 分隔窗體.
好了, 我們可以准備啟動程序了, 我們可以用 gtk_widget_show() 來顯示各個
控制項, 然後我們就應該進入到所謂的事件響應循環了, 這就要使用 gtk_main().
在程序運行過程中, 我們要操縱控制項, 比如說我們要在一個 entry 控制項(文本框
) 中取出其中的文字, 這樣的操作使用 gtk_控制項類型_動作(對象, 參數) 的形
式完成的, 比如剛才所說的任務, 做法是 gtk_entry_get_text(entry).
順便講講 GTK 程序的退出, 關閉 GTK 的窗口 (即使是所有窗口) 也不代表程序
退出, 因為那說到底只是一個界面而已, 我們當然可以使用 exit() 的自爆法退
出, 但最好還是給 GTK 一個料理後事的機會, 在主窗口的 destroy 事件響應函
數上用 gtk_main_quit() 就好了.
編譯 GTK 程序的辦法也很簡單.
gcc -o foo foo.c `pkg-config --cflags --libs gtk+-2.0`
** 使用 Glade 快速定製用戶界面
好了, 說了一堆有的沒的, 如果我現在說我上面說的那一堆中的大部分我們都不
會用到, 是不是覺得偶很歉扁? 前面的介紹只是給大家 GTK 這個庫的一些基本
概念, 概念就好了, 我們倒真的不用拿這些來編程的. 想想, 一個復雜一點的界
面, 十幾個控制項, 再加上各種各樣的 container, 自己掛事件, 再加上超常的命
名, 想想都恐怖.
這時候, Glade 橫空出世了! 這是一個可視化的界面編輯器 --- 但它僅僅是一
個界面編輯器而已, 甚至連代碼編輯框也沒有給出. 先不管了, 打開 glade (安
裝省略, 饒了我把, 記得裝 libglade-dev), 應該很好懂了, 指指點點就能弄好
一個界面, 然後在屬性窗的信號一欄中選取需要的信號, 設定響應函數, 非常好
弄.
玩了幾分鍾, 問題來了, 怎麼把它變為程序啊? 提供類似功能的 IDE 如
Borland C++ Builder, 在點擊創建新控制項的時候, 我們能即使在代碼窗看到自
動生成的代碼, Glade 也可以採用這種形式, 在設計好界面並保存後, 按一下主
窗口的 build 按鈕, 它就自動生成了界面代碼, 根本不用自己寫的. 打開代碼
目錄, callbacks.c 里已經有自動創建的事件響應的空函數, 在裡面填處理, 然
後 configure make 就行了.
但是, 這樣的開發方式還是有問題的. 第一, 自動生成的代碼非常復雜, 可是很
多時候我們還是不能完全不看它, 處理和界面是混在一起了, 理解他們變得困難
; 其二, 由於以上的原因, 修改界面變得非常痛苦; 其三, 它給你生成那堆有的
沒的配置文件不一定是你想要的.
因此 glade 提供了另一種方法, glade 編輯所得的 .glade 文件是一個 XML 文
件, 其實它已經完整地描述了界面, 我們能否採用一種簡單的方式直接載入, 配
置它呢. 這樣做, 我們的代碼中就真真正正地去處了煩人的界面生成代碼, 而專
注於處理部分了.
libglade 正是由於這個而來, 它能很好地完成上面所說的工作. 當我們用
glade 創建了一個 .glade 界面後, 用這種方法我們就可以建立界面, 運行程序
了.
#include <gtk/gtk.h>
#include <glade/glade.h>
GladeXML *GUI;
int
main(int argc, char **argv)
{
gtk_init(&argc, &argv);
/* load the interface */
GUI = glade_xml_new("frame.glade", NULL, NULL);
/* connect the signals in the interface */
glade_xml_signal_autoconnect(GUI);
/* start the event loop */
gtk_main();
return 0;
}
剩下的事情很簡單, 如果你的 button 的 clicked 控制項有一個響應函數
on_button_clicked, 你寫
void
on_button_clicked(GtkWidget *widget, gpointer data)
{
// balabalabala
}
就可以了. 所以, 上面講的一堆創建界面的方法, 其實大部分時候都用不著.
由於用到了 libglade, 我們的編譯方法變為
gcc -o foo foo.c `pkg-config --cflags --libs libglade-2.0`
** 開發舉例
一個很簡單的程序, 密碼學對稱加密演算法要用到的, 如果說是界面, 就是三個文
本框: 明文, 密碼, 密文, 三個按鈕, 加密, 解密, 清除, 完了. 為了實驗眾多
的演算法, 我們加了一個下拉窗口, 用來選擇演算法. 我把它設計成一個 wrapper
和框架, 它不實現任何演算法, 只是在界面中獲取用戶輸入, 調用外部程序, 並把
結果顯示出來而已. 這樣, 實際的演算法實現可以用純 C 寫的文本界面程序完成,
移植起來很方便, 在 windows 隨便做個一樣的界面做前端就整個移植過去了.
於是, 我們需要的窗體元素是 GtkEntry, GtkComboBoxEntry, GtkButton, 查查
手冊, 我們用到的界面相關的函數只有以下幾個:
- gtk_entry_get_text(), 用於獲取文本框輸入
- gtk_entry_set_text(), 用於在文本框中顯示結果
- gtk_combo_box_get_active_text(), 用於在 ComboBoxEntry (派生自
ComboBox) 取出用戶選中的演算法.
另一個問題是, 他們都需要相應的對象指針做參數, 這應該怎樣獲得呢? 我們使
用 glade_xml_get_widget(GUI, "控制項名") 就能取得控制項了.
⑺ GTK+ 基礎,第 2 部分: 如何使用 GTK+
本文假設讀者熟悉基本的面向對象概念,比如類、對象、方法和繼承。雖然不需要能夠用 C 編寫程序,但是需要對 C 語言的語法有基本的理解。C 語言的 GTK+ 應用程序剖析我發現最好用示例來討論代碼。對於本文來說,我使用一個用 C 編寫的名為 Hello World 的簡短應用程序。雖然短小 —— 而且作為應用程序來說,基本沒什麼用 —— 但是這個應用程序的代碼確實展示了在進行 GTK+ 編程時可能會碰到的一些最有趣的概念(參見清單 1)。清單1. Hello World 應用程序的 GTK+ 代碼 #include <gtk/gtk.h> #include <libintl.h> #define _(x) gettext (x) #define N_(x) (x) #define GETTEXT_PACKAGE "gtk-hello" #define LOCALEDIR "mo" static char *greetings[] = { "Hello World", "Witaj ?wiecie", "世界に今日は" }; static char* choose_greeting () { return greetings[g_random_int_range (0, G_N_ELEMENTS (greetings))]; } static void cb_button_click(GtkButton *button, gpointer data) { GtkWidget *label = GTK_WIDGET(data); g_assert(label != NULL); gtk_label_set_text(GTK_LABEL (label), choose_greeting()); } static gboolean cb_delete(GtkWidget *window, gpointer data) { gtk_main_quit(); return FALSE; } int main (int argc, char *argv[]) { GtkWidget* window, *button, *label, *vbox; bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); gtk_init(&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); button = gtk_button_new_with_label (_("Hello World")); label = gtk_label_new (choose_greeting()); vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER (window), vbox); gtk_container_add(GTK_CONTAINER (vbox), label); gtk_container_add(GTK_CONTAINER (vbox), button); g_signal_connect(G_OBJECT (window), "delete-event", G_CALLBACK(cb_delete), NULL); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (cb_button_click), label); gtk_widget_show_all(window); gtk_main(); return 0; }概述在進入細節之前,先看看運行 Hello World 程序時發生的情況:初始化 GTK+ 和國際化(i18n)支持。創建部件(widget)。部件被組織成層次結構,讓 GTK+ 知道如何在屏幕上顯示它們。兩個信號處理器被連接起來 —— 一個用來在用戶關閉窗口時退出應用程序,另一個用來在用戶點擊按鈕時,修改顯示的歡迎信息。在屏幕上顯示窗口,應用程序調用 gtk_main(),激活主循環。主循環一直運行,直到用戶關閉窗口,調用 gtk_main_quit() 時才結束。初始化以下幾行初始化 GTK+ 和 i18n 支持:清單2. 初始化 GTK+ 和 i18n 支持 int main (int argc, char *argv[]) { GtkWidget* window, *button, *label, *vbox; bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); gtk_init(&argc, &argv); C 程序員應當熟悉 main 聲明。(如果不是 C 程序員,那麼只需要知道這是應用程序開始執行的函數。)下一行包含幾個到 GtkWidget 類型的指針的聲明。GTK+ 是一個面向對象的工具包。所以,它使用常見的面向對象概念(例如繼承)來實現不同的部件。作為語言,C 缺乏對面向對象的內置支持。GTK+ 通過使用一些更聰明的技巧和 C 標准要求的一些有幫助的屬性,克服了這個缺點。在這個方案中,對象由指針代表,而 GtkWidget 是GTK+ 層次結構中的基本類型 —— 叫做 類,其他類都從它派生而來。所以,我把變數聲明為 GtkWidget*。下三行是在程序開始的地方應當包含的調用,用來得到國際化介面的支持。注意,在真實的應用程序中,不會手動聲明 LOCALEDIR 和GETTEXT_PACKAGE。編譯系統將會處理這些聲明。但是,在這個簡單示例中,聲明有助於澄清需要的內容。最後一行調用 gtk_init()。在進行其他 GTK+ 調用之前,必須調用這個函數,並把調用程序使用的參數傳遞給它。如果這個調用失敗,就會從沒有機會正確初始化自己的各個子系統得到多個錯誤消息。創建部件這四行分別調用不同的 _new() 函數:清單3. 調用不同的 _new() 函數 window = gtk_window_new (GTK_WINDOW_TOPLEVEL); button = gtk_button_new_with_label (_("Hello World")); label = gtk_label_new (choose_greeting()); vbox = gtk_vbox_new(FALSE, 0); 關於TOPLEVEL 的警告在看到 gtk_window_new 的TOPLEVEL 參數之後,可能想知道是否有其他可能的窗口類型。實際上,確實有。但是,對於 TOPLEVEL 之外的類型的需要很少見。而且,要使用不同的類型,必須對 GTK+ 與窗口系統的交互方式有很好的理解。所以,規則很簡單:一直 使用TOPLEVEL 參數。正如您所想,這些函數創建新的部件。所以,它們是代表部件的對象的構造函數。在 C++ 中,用特殊的方式標記構造函數,並用特殊語法進行調用。但是,因為 C 不支持面向對象,所以它們與普通的函數沒有什麼不同。只有添加到函數名尾部的 _new() 才表示這些函數實際上是構造函數。規定是:gtk_* 名稱空間中的每個構造函數都返回一個到 GtkWidget 的指針。這樣,通過聲明這種類型的變數,可以直接把構造函數調用的結果分配給對應的變數。如果查看單獨的構造函數,可以看到它們接受不同的參數,對應著它們創建的部件的類型。具體來說,gtk_window_new (GTK_WINDOW_TOPLEVEL) 創建新的 TOPLEVEL 窗口;也就是與用戶看成窗口的東西對應的部件,具有標題欄、關閉按鈕或者窗口系統添加的其他元素。對label 和button 的構造函數的調用做的工作正如您所料。但是,請注意傳遞給 button 的字元串周圍的下劃線和括弧(_())。這個宏調用 gettext() 常式,並且對於界面轉換至關重要。(關於 gettext 的更多信息,請參閱 參考資料。) 模樣古怪的 gtk_vbox_new(FALSE, 0) 創建垂直框(VBox)。雖然這個部件與屏幕上的任何可視像素都不對應,但是它在 GTK+ 的控制項布局中扮演著重要角色,您很快就會看到這一點。 決定布局這三行決定部件的布局: gtk_container_add(GTK_CONTAINER (window), vbox); gtk_container_add(GTK_CONTAINER (vbox), label); gtk_container_add(GTK_CONTAINER (vbox), button); 這些行是對類型 GtkContainer 的面向對象方法的調用。如果查看應用程序編程介面(API)參考,可以看到 GtkContainer 繼承自 GtkWidget,而且它的全部方法都接受 GtkContainer* 作為第一個參數。所以,GtkContainer* 是方法要在上面操作的對象實例。因為變數是 GtkWidget* 類型的,而且 C 編譯器不支持面向對象繼承,所以需要讓編譯器相信:向需要 GtkContainer* 的函數傳遞這些變數是安全的。GTK_CONTAINER() 宏通過實現到類型安全版 GtkContainer 的類型轉換做到了這一點。類型安全 意味著宏在進行類型轉換之前,會驗證指定操作可以在指定類型上安全地執行。如果宏不能執行指定操作,就會提供警告。因為GTK+ 使用方框布局 模型,所以不必顯式地指定部件應當放在屏幕上的什麼位置。相反,要指明部件放在其他哪個窗口部件內。在 Hello World 應用程序中,每個 gtk_container_add() 方法調用都告訴應用程序用第一個參數(或 雙親部件),並把第二個參數(或 子部件)放在雙親部件內。在這個示例中使用的 VBox 部件是一種布局部件,它垂直地排列子部件。這樣,在它內部放置標簽和按鈕時,結果就是按鈕顯示在標簽下。這是需要做的全部工作。如果您曾經用過絕對定位(在某些工具包中使用的模型,例如 Win32)手動調整部件或重新設置部件大小,那麼您會很高興知道在 GTK+ 中所有這些都是自動完成的。連接信號和主循環在創建並組織好部件之後,該給它們添加些邏輯了。GTK+ 像多數 GUI 工具包一樣,是一個事件驅動框架。所以,它是圍繞主循環 組織的。主循環在連續的檢查-分配-睡眠周期上操作。當事件發生時,與這個事件對應的對象發出信號,通知主循環事件已經發生。然後主循環查詢自己的信號和處理程序之間的內部映射表,也叫做 回調,並調用注冊到指定對象的指定信號的處理程序。在Hello World 代碼中,回調的注冊看起來像這樣:清單4. 回調的注冊 g_signal_connect(G_OBJECT (window), "delete-event", G_CALLBACK(cb_delete), NULL); g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(cb_button_click), label); 請注意在 GTK+ 中,connect(連接) 到信號。第一行把 cb_delete 函數連接到 window 對象的 delete-event 信號。類似地,第二行把 cb_button_click 函數連接到 button 對象的 clicked 信號。請注意在第二個連接調用中的第四個參數 label。稍後會看到它在 cb_button_click 函數中是如何使用的。下面是 cb_delete 函數,它在用戶關閉窗口時退出應用程序: static gboolean cb_delete(GtkWidget *window, gpointer data) { gtk_main_quit(); return FALSE; } static 修飾符 在C 中,static 關鍵字在內部鏈接函數,這意味著靜態函數在聲明它的源文件之外不可見。除非需要在不止一個文件中使用回調,否則請一直使用 static 關鍵字聲明回調。使用這個方法,可以避免把可用函數名稱的有限名稱空間弄混亂。因為靜態函數被局限在一個文件,所以可以安全地重用函數名稱。 這個函數接受 GtkWidget* 和一個未指定的 data 指針(gpointer 是等價於 void* 的類型),因為 "delete-event" 的每個回調都必須符合這個原型。但是,這個函數不需要這些參數,所以它們被忽略了。它調用 gtk_main_quit() 常式以退出主循環。而且,該函數返回布爾值,因為為 GtkWidget 定義的 delete-event 信號的回調原型指明的是布爾返回值。布爾值決定 GTK+ 採取的行動。如果它返回 TRUE 值,那麼事件就被認為已經得到處理,而且不調用默認處理程序(該默認處理程序從窗口系統刪除部件)。有的時候,例如,如果想顯示一條消息,請求尚未保存的數據,並根據用戶的響應阻止窗口關閉,那麼這個函數會很有用。下面是 cb_button_click 函數,在用戶點擊按鈕時,它修改顯示的歡迎信息:清單5. cb_button_click 函數 static void cb_button_click(GtkButton *button, gpointer data) { GtkWidget *label = GTK_WIDGET(data); g_assert(label != NULL); gtk_label_set_text(GTK_LABEL (label), choose_greeting()); } 可以看到,這個函數與 cb_delete 函數類似,不同之處是它什麼也不返回,而且它接受 GtkButton* 而不是 GtkWidget。代碼把 data 轉換成到 GtkLabel 的指針。還記得在回調注冊中的 label 參數么?現在每次調用回調時,data 指針都會包含到那個標簽的指針。每當需要向回調傳遞額外的信息時,都可以使用 data 參數。類似地,如果需要訪問發出信號的對象,就要使用第一個參數,在這個具體回調中是 button。在得到標簽的指針後,代碼使用 g_assert 宏來確定標簽是否等於 NULL。g_assert 宏是一個來自 Glib (GTK+ 使用的一個有用的 C 類型和常式庫)的工具宏,如果傳遞給它的條件滿足,就會中止程序 —— 在這個示例中,條件是 label 等於NULL。因為 label 等於NULL 意味著程序員犯了錯誤,所以這可以確保在代碼投入生產之前捕獲到錯誤。顯示窗口在回調連接好之後,gtk_widget_show_all() 函數使窗口 —— 即所有的部件 —— 都顯示在屏幕上(參見圖 1)。圖1. Hello World 應用程序,用波蘭語和日語運行激活主循環當諸事就位,而且顯示出來之後,gtk_main() 函數就激活主循環。主循環進入無限循環,等候事件並調用回調,直到有人關閉窗口,調用 gtk_main_quit() 為止。注意:如果對代碼仍有問題,請參閱附帶的源代碼。它與文章中介紹的代碼完全相同,但是每一行都包含詳細的注釋。編譯和運行要編譯這個程序,需要 C 編譯器和 GTK+ 的開發文件(頭和庫)。有關如何獲取這些項目的信息,請參閱 參考資料。在安裝完文件之後,請解壓源代碼,進入源代碼將要解壓到的目錄,並運行 make: $ tar -xzf gtk_hello.tgz $ cd gtk_hello $ make 注意:如果正在運行 Microsoft�0�3 Windows�0�3,請不要運行 make,而是打開 Microsoft Visual Studio�6�4.NET 並運行 「hello」 項目。回頁首在其他編程語言中的 GTK+可以在多個編程語言中使用 GTK+。要做到這點,需要使用綁定。綁定 是針對指定語言的特殊包,它用適合該語言的方式公開 GTK+ API。例如,我已經把 Hello World 應用程序轉換成 Python 和 C#。要在這些語言中運行 GTK+,除了 Python 和 Mono/.NET 之外,分別還需要 PyGTK 和 Gtk#(請參閱 參考資料)。PyGTK 中的 Hello World 清單6 顯示了轉換成 Python 的 Hello World 應用程序的代碼。清單6. PyGTK 中的 Hello World 應用程序 import pygtk pygtk.require('2.0') import gtk import random greetings = ["Hello World", "Witaj ?wiecie", "世界に今日は"] def choose_greeting (greets): return greets[random.randint (0, len(greets) - 1)] def cb_clicked(button, label): label.set_text(choose_greeting(greetings)) window = gtk.Window () vbox = gtk.VBox () button = gtk.Button("Hello World") label = gtk.Label (choose_greeting (greetings)) window.add(vbox) vbox.add(label) vbox.pack_start(button, False, False) window.connect("delete-event", lambda a,b: gtk.main_quit()) button.connect("clicked", cb_clicked, label) window.show_all() gtk.main() 由於緊湊的 Python 代碼,應用程序的這個版本比它的 C 語言對應物更短。除此之外,看起來是相似的。注意,代碼被轉換成使用 Python 的習慣,但是 API 保持不變。Gtk# 中的 Hello WorldGtk# 中的 Hello World 應用程序代碼要比 C 版本略長,因為 C# 要求的聲明很長。所以,我沒有在這里包含完整的源代碼。源代碼包含在附加的下載中。下面快速查看一下 C 到 C# 的主要概念轉換: class GtkHello : Gtk.Window { 現在不再創建並設置新窗口,而是把 Gtk.Window 類放進一個子類,並把所有設置代碼移動到構造函數。這種方法並非特定於 Gtk#。實際上,在 C 程序中,當需要窗口的多個拷貝時,經常使用這種方法。但是,在 C# 中使用子類如此之容易,所以即使對一個實例這么做也有意義 —— 特別是在考慮到 C# 要求至少聲明一個類的時候,更是如此。 this.DeleteEvent += new DeleteEventHandler(DeleteCB); button.Clicked += new EventHandler(ButtonClickCB); 可以看到,GTK+ 信號被轉換成地道的 C# 事件概念。名稱也被稍加修改,以更好地符合 C# 的命名規范。清單7. GTK+ 信號被轉換成地道的 C# 事件概念 private void DeleteCB (object o, DeleteEventArgs args) { Application.Quit (); args.RetVal = true; } 由於C# 事件的構造方式,所以 delete-event 處理程序的原型略有不同。它不是從回調返回 true,而是通過 args.RetVal 傳遞返回值。gtk_main() 和gtk_main_quit() 分別被 Application.Run() 和Application.Quit() 代替。回頁首有用的工具在使用 GTK+ 進行開發時,有幾個工具可以讓工作輕鬆些。其中最著名的幾個工具是 Glade、Libglade 和 Devhelp。Glade 和 LibgladeGlade 是一個界面構建器 —— 這個程序可以圖形化地構建應用程序,而不必手動從源代碼開始構建。更重要的是第二個組件:Libglade。顧名思義,Libglade 支持讀取可擴展標記語言(XML)格式,Glade 用 XML 保存用戶界面描述。使用 Libglade,可以直接從這個描述構建應用程序的界面,而不需要任何代碼。圖2 顯示了一個包含幾個部件的簡單的 Libglade 應用程序。圖2. 簡單的 Libglade 應用程序清單8 顯示了圖 2 所示的 Libglade 應用程序的完整源代碼。清單8. Libglade 應用程序的源代碼 #include <gtk/gtk.h> #include <glade/glade.h> int main (int argc, char *argv[]) { GladeXML *ui; gtk_init(&argc, &argv); /* Read user interface description from glade file */ ui = glade_xml_new ("glade_hello.glade", "main_window", NULL); /* Automatically connect signals */ glade_xml_signal_autoconnect(ui); gtk_main(); return 0; } 可以看到,所有的事情只有 17 行代碼,包括注釋和空行。雖然真正的應用程序不會這么短,但是從代碼的清晰性、模塊性和可管理性來說,Libglade 帶來了巨大的提高。如果想進一步研究這個程序是如何構建的,可通過本文附帶的下載中其餘的示例進行了解。DevhelpDevhelp 是一個文檔瀏覽器,是為了閱讀用 gtk-doc 生成的格式的文檔而設計的,gtk-doc 是構建 GTK+ 文檔的標准工具,相關的項目,例如 Pango 和 GNOME 也使用它。使用 Devhelp,可以迅速地搜索函數索引並瀏覽已經安裝的文檔,從而可以更迅速地獲得需要的信息。Devhelp 是一個 GNOME 應用程序。所以,要運行它,需要一個符合 POSIX 的操作系統,在上面運行 GNOME,例如 Linux�0�3 或 Sun Solaris,還需要 GNOME 運行時庫。不需要運行 GNOME 本身。如果使用其他平台,也有許多其他方法可以閱讀 GTK+ 文檔。Mono 項目有 Monodoc 瀏覽器,它通常是與 Gtk# 參考一起預先裝入的。GTK+ 的 Windows 安裝器也通常包含適合各種開發工具的文檔格式,例如 Visual Studio�0�3。最後,總有使用 Web 瀏覽器在線閱讀文檔這個選項,但是推薦採用專用瀏覽器,因為它的速度快,還有針對在程序文檔中進行搜索而設計的額外特性。下期預報在這篇文章中,學習了 GTK+ 編程中使用的基本概念。還看到了如何在 C 語言之外的語言中使用 GTK+,在保持使用 GTK+ 的一般方式的同時,還使用了特定於這些語言的方式。最後,還介紹了有助於更快更好地開發應用程序的工具。在本系列的最後一期中,將進一步觀察 GTK+ 開發的另一個方面:部署。文章將詳細分析各種選項,包括移植性的考慮和安裝的簡易。最後,將以更廣闊的視野來看 GTK+ —— 作為一個有活躍社區的項目,它有助於構建出更好地為用戶服務的應用程序。回頁首下載描述名字大小下載方法Source codeos-gtk2_hello.zip18KBHTTP關於下載方法的信息參考資料 學習您可以參閱本文在 developerWorks 全球站點上的 英文原文。 請閱讀 developerWorks 「GTK+ 基礎」 系列中的全部文章。 GNU Gettext 是一個用於應用程序運行時轉換的庫。 Libglade Reference Manual 是用來動態創建 GTK+ 界面的庫。 請訪問 GTK+ 獲得關於工具包的更多信息。 全面的 GTK+ API Documentation 對於所有開發人員都很重要。 Matthias Warkus 編寫的 The Official GNOME 2 Developer's Guide(No Starch Press,2004 年)介紹了 GNOME 2,包括使用 GTK+ 進行編程。 請訪問 developerWorks 開放源碼專區 獲得豐富的 how-to 信息、工具和項目更新,幫助您用開放源碼技術進行開發並把它們用於 IBM 的產品。 獲得產品和技術 請獲取 Gtk#,這是針對 Microsoft .NET 環境的 GTK+ 綁定。 請獲取 GTK+ 的官方 source code tarballs。 請訪問 PyGTK,這是 Python 的 GTK+ 綁定的官方站點。 Gazpacho 是Glade UI 描述文件的改進的編輯器,是用 PyGTK 編寫的。 Devhelp 是用於 GNOME 的一個面向程序員的文檔瀏覽器。 請參閱 GNOME,這是使用 GTK+ 構建的側重於應用的桌面。 請嘗試 Xfce,這是一個快速而易用的桌面,也是用 GTK+ 開發的。 請訪問 Gnomefiles 並得到超過 1,000 個用 GTK+ 構建的應用程序。 請用IBM 試用軟體 改造您的下一個開放源碼開發項目,這些軟體可以下載也可以通過 DVD 得到。 討論 請在GTK+ mailing lists 上獲得關於用 GTK+ 開發軟體的支持並詢問相關問題。 通過參與 developerWorks blogs 加入developerWorks 社區。 關於作者Maciej Katafiasz 是計算機科學專業的研究生,從高中起就一直使用開放源碼技術。從 GNOME 1.0 起,他就是 GNOME 桌面的用戶,而 2.0 版一發布,他就愛上了它並了解到 GTK+ 能夠開發自己喜歡的桌面。關閉[x]關於報告濫用的幫助報告濫用謝謝! 此內容已經標識給管理員注意。關閉[x]關於報告濫用的幫助報告濫用報告濫用提交失敗。 請稍後重試。關閉[x]developerWorks:登錄IBM ID:需要一個 IBM ID?忘記IBM ID?密碼:忘記密碼?更改您的密碼 保持登錄。單擊提交則表示您同意developerWorks 的條款和條件。 使用條款 當您初次登錄到 developerWorks 時,將會為您創建一份概要信息。您在developerWorks 概要信息中選擇公開的信息將公開顯示給其他人,但您可以隨時修改這些信息的顯示狀態。您的姓名(除非選擇隱藏)和昵稱將和您在 developerWorks 發布的內容一同顯示。所有提交的信息確保安全。關閉[x]請選擇您的昵稱:當您初次登錄到 developerWorks 時,將會為您創建一份概要信息,您需要指定一個昵稱。您的昵稱將和您在 developerWorks 發布的內容顯示在一起。昵稱長度在 3 至 31 個字元之間。 您的昵稱在 developerWorks 社區中必須是唯一的,並且出於隱私保護的原因,不能是您的電子郵件地址。昵稱:(長度在 3 至 31 個字元之間)單擊提交則表示您同意developerWorks 的條款和條件。 使用條款. 所有提交的信息確保安全。為本文評分評論回頁首
⑻ linux的gcc如何編譯gtk程序啊
因為gtk庫需要鏈接庫文件,可以通過pkg-config來獲取gtk的庫文件路徑
⑼ 如何使用gcc在EditPlus編輯器下對GTK程序進行靜態編譯
GTK的安裝
sudo apt-get install vim #使用vim來編寫代碼,當然您可以使用任何自己喜歡的編輯器
sudo apt-get install build-essential #這將安裝gcc/g++/gdb/make 等基本編程工具
sudo apt-get install gnome-core-devel #這將安裝 libgtk2.0-dev libglib2.0-dev 等開發相關的庫文件
sudo apt-get install pkg-config #用於在編譯GTK程序時自動找出頭文件及庫文件位置
sudo apt-get install devhelp #這將安裝 devhelp GTK文檔查看程序
sudo apt-get install libglib2.0-doc libgtk2.0-doc #這將安裝 gtk/glib 的API參考手冊及其它幫助文檔
sudo apt-get instal glade libglade2-dev #這將安裝基於GTK的界面GTK是開發Gnome窗口的c/c++語言圖形庫。在Ubuntu的機器上折騰了一下,復制了網上教程的代碼在本機上編譯。代碼的文件名:t1.c。按照教程,用以下命令編譯:
gcc t1.c 'pkg-config --cflags --libs gtk+-2.0`
編譯結果:找不到gtk/gtk.h。
因為我的Ubuntu是Gnome系統,所以我以為gtk+2.0的開發程序(頭文件和庫文件)應該已經安裝在計算機上了。其實不然,如果在Ubuntu 上開發gtk+2.0的程序,需要安裝相應的頭文件和庫。在控制台窗口輸入sudo apt-get install libgtk2.0*, gtk+2.0所需的所有文件統通下載安裝完畢。再次應用編譯命令:gcc t1.c 'pkg-config --cflags --libs gtk+-2.0,編譯通過,運行。
pkg-config是一個用來管理包的程序,在控制台輸入 pkg-config --cflags --libs gtk+-2.0 的運行結果:
-DPNG_NO_MMX_CODE -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/freetype2 -I/usr/include/libpng12 -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lfontconfig -lXext -lXrender -lXinerama -lXi -lXrandr -lXcursor -lXcomposite -lXdamage -lpango-1.0 -lcairo -lX11 -lXfixes -lgobject-2.0 -lgmole-2.0 -ldl -lglib-2.0
可以看出,輸出的文本包括了gcc編譯gtk+2.0所需要的所有選項(頭文件目錄和庫文件)。
這里有一點需要注意, gcc t1.c `pkg-config --cflags --libs gtk+-2.0`, pkg-config --cflags --libs gtk+-2.0兩側的引號並不是真正的引號,而是鍵盤數字件那一行,最左邊的那個字元。如果錯用了單引號,gcc無法使用 pkg-config --cflags --libs gtk+-2.0產生的文本作為編譯選項。構造程序。
$ gcc gtkhello.c -o gtktest `pkg-config --cflags --libs gtk+-2.0`
$ ./gtktest
gcc gtk1.c `pkg-config --cflags --libs gtk+-2.0`
//////////////////////////////////////////////////////////////////////////////////////////////////////
首先獲得超級用戶許可權
apt-get install vim #使用vim來編寫代碼,當然您可以使用任何自己喜歡的編輯器
apt-get install build-essential #這將安裝gcc/g++/gdb/make 等基本編程工具
apt-get install gnome-core-devel #這將安裝 libgtk2.0-dev libglib2.0-dev 等開發相關的庫文件
apt-get install pkg-config #用於在編譯GTK程序時自動找出頭文件及庫文件位置
apt-get install devhelp #這將安裝 devhelp GTK文檔查看程序
apt-get install libglib2.0-doc libgtk2.0-doc #這將安裝 gtk/glib 的API參考手冊及其它幫助文檔
apt-get instal glade libglade2-dev #這將安裝基於GTK的界面構造程序
都是安裝好後測試一下程序hello.c
#include <gtk/gtk.h> ----------我編譯時老是說找不到頭文件,後來在/usr/include里找到gtk-2.0/gtk/gtk.h,原來是路徑錯誤,最後將頭文件路徑修改為<gtk-2.0/gtk/gtk.h>,終於好了!
void hello(GtkWidget *widget,gpointer data)
{
g_print("Hello 大家好\n");
}
gint delete_event(GtkWidget *widget,GdkEvent *event,gpointer data)
{
g_print ("delete event occurred\n");
return(TRUE);
}
void destroy(GtkWidget *widget,gpointer data)
{
gtk_main_quit();
}
int main( int argc, char *argv[] )
{
GtkWidget *window;
GtkWidget *button;
gtk_init (&argc, &argv);
window=gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_signal_connect (GTK_OBJECT(window),"delete_event",GTK_SIGNAL_FUNC(delete_event),NULL);
gtk_signal_connect (GTK_OBJECT (window), "destroy",GTK_SIGNAL_FUNC (destroy), NULL);
gtk_container_set_border_width (GTK_CONTAINER (window), 10);
button = gtk_button_new_with_label ("Hello 大家好");
gtk_signal_connect (GTK_OBJECT (button), "clicked",GTK_SIGNAL_FUNC (hello), NULL);
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",GTK_SIGNAL_FUNC(gtk_widget_destroy),GTK_OBJECT (window));
gtk_container_add (GTK_CONTAINER (window), button);
gtk_widget_show (button);
gtk_widget_show (window); /*顯示一個窗口*/
gtk_main(); /*進入主循環*/
return(0);
}
最後編譯運行:
$ gcc hello.c -o hello `pkg-config --cflags --libs gtk+-2.0`
$ . /hello
////////////////////////////////////////////////////////////////////
GTK的安裝
sudo apt-get install vim #使用vim來編寫代碼,當然您可以使用任何自己喜歡的編輯器
sudo apt-get install build-essential #這將安裝gcc/g++/gdb/make 等基本編程工具
sudo apt-get install gnome-core-devel #這將安裝 libgtk2.0-dev libglib2.0-dev 等開發相關的庫文件
sudo apt-get install pkg-config #用於在編譯GTK程序時自動找出頭文件及庫文件位置
sudo apt-get install devhelp #這將安裝 devhelp GTK文檔查看程序
sudo apt-get install libglib2.0-doc libgtk2.0-doc #這將安裝 gtk/glib 的API參考手冊及其它幫助文檔
sudo apt-get instal glade libglade2-dev #這將安裝基於GTK的界面GTK是開發Gnome窗口的c/c++語言圖形庫。在Ubuntu的機器上折騰了一下,復制了網上教程的代碼在本機上編譯。代碼的文件名:t1.c。按照教程,用以下命令編譯:
gcc t1.c 'pkg-config --cflags --libs gtk+-2.0`
編譯結果:找不到gtk/gtk.h。
因為我的Ubuntu是Gnome系統,所以我以為gtk+2.0的開發程序(頭文件和庫文件)應該已經安裝在計算機上了。其實不然,如果在Ubuntu 上開發gtk+2.0的程序,需要安裝相應的頭文件和庫。在控制台窗口輸入sudo apt-get install libgtk2.0*, gtk+2.0所需的所有文件統通下載安裝完畢。再次應用編譯命令:gcc t1.c 'pkg-config --cflags --libs gtk+-2.0,編譯通過,運行。
pkg-config是一個用來管理包的程序,在控制台輸入 pkg-config --cflags --libs gtk+-2.0 的運行結果:
-DPNG_NO_MMX_CODE -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/freetype2 -I/usr/include/libpng12 -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lfontconfig -lXext -lXrender -lXinerama -lXi -lXrandr -lXcursor -lXcomposite -lXdamage -lpango-1.0 -lcairo -lX11 -lXfixes -lgobject-2.0 -lgmole-2.0 -ldl -lglib-2.0
可以看出,輸出的文本包括了gcc編譯gtk+2.0所需要的所有選項(頭文件目錄和庫文件)。
這里有一點需要注意, gcc t1.c `pkg-config --cflags --libs gtk+-2.0`, pkg-config --cflags --libs gtk+-2.0兩側的引號並不是真正的引號,而是鍵盤數字件那一行,最左邊的那個字元。如果錯用了單引號,gcc無法使用 pkg-config --cflags --libs gtk+-2.0產生的文本作為編譯選項。構造程序。
$ gcc gtkhello.c -o gtktest `pkg-config --cflags --libs gtk+-2.0`
$ ./gtktest
gcc gtk1.c `pkg-config --cflags --libs gtk+-2.0`
⑽ gtk編寫的exe程序怎樣在別的沒安裝gtk電腦上運行
簡單點來說,你應該將gtk目錄下的bin,etc,lib,share目錄提出來放到一個新的目錄下,然後將你的exe文件放到bin目錄下,你們exe文件就可以運行了。當然這樣bin,etc,lib和share目錄下其實還有很多無用的文件與目錄,你可以自己試著刪減就可以了。