1. 程式人生 > >linux gtk 介面設計工具:glade簡介

linux gtk 介面設計工具:glade簡介

python語言可以呼叫glade檔案,生成程式介面.在程式中,不需對介面進行配置等操作.
在/tmp/project1裡編輯一個calc.py檔案,新增下面的內容:

#!/usr/bin/env python
# calc
import sys
try:
	import pygtk
	pygtk.require("2.0")
except:
	pass
try:
	import gtk
	import gtk.glade
except:
	print "This program need to be run in graphical environment!"
	sys.exit(1)

class calc:
	# 初始化calc類
	def __init__(self):
		self.level = 1
		self.method = 1
		self.value1 = 0
		self.value2 = 0
		# 定義使用的glade
檔案 self.gladefile = "./calc.glade" # 將glade檔案中的介面匯入到self.wTree中 self.wTree = gtk.glade.XML(self.gladefile) # 建立一個字典描述各個訊號量的處理函式 # "on_window1_destroy"的處理方法是gtk.main_quit,即主程式退出. # 其他按鍵的處理方法是各自的處理函式. dic = { "on_window1_destroy" : gtk.main_quit, "on_button1_clicked" : self.button1_clicked, "on_button2_clicked" : self.button2_clicked, "on_button3_clicked" : self.button3_clicked, "on_button4_clicked" : self.button4_clicked, "on_button5_clicked" : self.button5_clicked, "on_button6_clicked" : self.button6_clicked, "on_button7_clicked" : self.button7_clicked, "on_button8_clicked" : self.button8_clicked, "on_button9_clicked" : self.button9_clicked, "on_button0_clicked" : self.button0_clicked, "on_buttonadd_clicked" : self.buttonadd_clicked, "on_buttonsub_clicked" : self.buttonsub_clicked, "on_buttonsum_clicked" : self.buttonsum_clicked } # 將dic與控制元件的signal連線 self.wTree.signal_autoconnect(dic) # 定義self.label1變數,它指向控制元件label1 self.label1 = self.wTree.get_widget("label1") # 定義各個按鍵的clicked事件 # self.value1,self.value2,self.value3,分別表示算術表示式的第1個數字,第2個數字和計算結果. # self.level==1表示此數值作為算術表示式的第1個數字,self.level==2表示此數值作為算術表示式的第2個數字. # self.method==1表示進行加法運算,self.method==2表示進行減法運算. # 定義1-0按鍵的clicked處理函式 def button1_clicked(self, widget): if self.level == 1: self.value1 = 1 elif self.level == 2: self.value2 = 1 def button2_clicked(self, widget): if self.level == 1: self.value1 = 2 elif self.level == 2: self.value2 = 2 def button3_clicked(self, widget): if self.level == 1: self.value1 = 3 elif self.level == 2: self.value2 = 3 def button4_clicked(self, widget): if self.level == 1: self.value1 = 4 elif self.level == 2: self.value2 = 4 def button5_clicked(self, widget): if self.level == 1: self.value1 = 5 elif self.level == 2: self.value2 = 5 def button6_clicked(self, widget): if self.level == 1: self.value1 = 6 elif self.level == 2: self.value2 = 6 def button7_clicked(self, widget): if self.level == 1: self.value1 = 7 elif self.level == 2: self.value2 = 7 def button8_clicked(self, widget): if self.level == 1: self.value1 = 8 elif self.level == 2: self.value2 = 8 def button9_clicked(self, widget): if self.level == 1: self.value1 = 9 elif self.level == 2: self.value2 = 9 def button0_clicked(self, widget): if self.level == 1: self.value1 = 0 elif self.level == 2: self.value2 = 0 def buttonadd_clicked(self, widget): self.level = 2 self.method = 1 def buttonsub_clicked(self, widget): self.level = 2 self.method = 2 def buttonsum_clicked(self, widget): self.level = 1 if self.method == 1: self.value3 = self.value1 + self.value2 elif self.method == 2: self.value3 = self.value1 - self.value2 self.label1.set_text(str(self.value3)) self.value1 = 0 self.value2 = 0 #主函式體 if __name__ == "__main__": frm = calc() gtk.main() # THE END

在桌面環境下的終端中執行:
$ cd /tmp/project1
$ python calc.py
glade-calc-13.jpg
這個計算器程式可以進行1位數字的加減運算.

===== 五.使用C語言呼叫glade檔案 =====
C語言也可以通過呼叫glade檔案,來生成程式介面.
在/tmp/project1裡編輯一個calc.c檔案,新增下面的內容:

// Calc.c
#include <gtk/gtk.h>
#include <glade/glade.h>

// 初始化變數,value1,value2,value3分別為算術表示式的第1個數字,第2個數字和運算結果
// method=0 表示進行加法計算,method=1表示進行減法計算.
// level=0 表示按鍵值賦於value1,level=1表示按鍵值賦於value2.
int value1=0;
int value2=0;
int value3=0;
int method=0;
int level=0;
GtkWidget * label1;

void on_window1_destroy(GtkWidget *widget, gpointer user_data) {
gtk_exit(1);
return FALSE;
}
// 定義數字鍵1-0的clicked處理函式
void on_button1_clicked(GtkWidget *widget, gpointer user_data) {
if(level)
	{ value2=1; }
else
	{ value1=1; }
}

void on_button2_clicked(GtkWidget *widget, gpointer user_data) {
if(level)
	{ value2=2; }
else
	{ value1=2; }
}

void on_button3_clicked(GtkWidget *widget, gpointer user_data) {
if(level)
	{ value2=3; }
else
	{ value1=3; }
}

void on_button4_clicked(GtkWidget *widget, gpointer user_data) {
if(level)
	{ value2=4; }
else
	{ value1=4; }
}

void on_button5_clicked(GtkWidget *widget, gpointer user_data) {
if(level)
	{ value2=5; }
else
	{ value1=5; }
}

void on_button6_clicked(GtkWidget *widget, gpointer user_data) {
if(level)
	{ value2=6; }
else
	{ value1=6; }
}

void on_button7_clicked(GtkWidget *widget, gpointer user_data) {
if(level)
	{ value2=7; }
else
	{ value1=7; }
}

void on_button8_clicked(GtkWidget *widget, gpointer user_data) {
if(level)
	{ value2=8; }
else
	{ value1=8; }
}

void on_button9_clicked(GtkWidget *widget, gpointer user_data) {
if(level)
	{ value2=9; }
else
	{ value1=9; }
}

void on_button0_clicked(GtkWidget *widget, gpointer user_data) {
if(level)
	{ value2=0; }
else
	{ value1=0; }
}

void on_buttonadd_clicked(GtkWidget *widget, gpointer user_data) {
	level=1;
	method=0;
}

void on_buttonsub_clicked(GtkWidget *widget, gpointer user_data) {
	level=1;
	method=1;
}

// 定義buttonsum按鍵的clicked處理函式
void on_buttonsum(GtkWidget *widget, gpointer user_data) {
	char s1[3];
	if(method) value3=value1-value2;
	else value3=value1+value2;
	value1=0;
	value2=0;
	level=0;
	sprintf(s1,"%d",value3);
	s1[2]='\0';
	gtk_label_set_text(GTK_LABEL(user_data),s1);
}

// 主函式
int main(int argc, char *argv[]) {
    Glade
XML *xml; GtkWidget * buttonsum; gtk_init(&argc, &argv); // 載入calc.glade檔案 xml = glade_xml_new("calc.glade", NULL, NULL); // 連線控制元件signal到處理函式,處理函式與控制元件signal的handle同名. glade_xml_signal_autoconnect(xml); label1 = glade_xml_get_widget(xml,"label1"); buttonsum = glade_xml_get_widget(xml,"buttonsum"); gtk_signal_connect(GTK_OBJECT(buttonsum), "clicked",GTK_SIGNAL_FUNC (on_buttonsum), label1); /* start the event loop */ gtk_main(); return 0; } // END

編譯這個程式,然後執行:
$ cc -o calc calc.c `pkg-config –cflags –libs libglade-2.0`
$ ./calc