#

在之前的章節裡,我們已經使用過很多次按鈕了,事實上先前使用的那些按鈕都是屬於傳統式Tk的視窗元件,它們是一種不支援佈景主題的視窗元件。而且不止是按鈕連同之前用過的標籤(label)及單行文字方塊(entry)也同樣不支援佈景主題。雖然說不支援佈景主題並不會影響到程式的功能性,但~為了順應趨勢外加體貼大家的眼睛,所以之後的文章都會以支援佈景主題的視窗元件為主,讓大家可以做出更漂亮的使用者介面。

17.1 佈景視窗元件

自Tk8.5版以後開始內建了支援佈景主題的視窗元件,而用來建立那些視窗元件的命令,都是掛在::ttk名稱空間之下,所以我們使用那些命令的時候都要在命令之前加上::ttk。為了方便說明,如果以後我說明時在視窗元件前冠上tk就表示它是傳統的視窗元件,但若冠上ttk就表示是支援佈景的視窗元件。現在就讓我們來看看tk按鈕和ttk按鈕的差別:



請注意到第2行,基本上ttk視窗元件命令和tk視窗元件命令使用上是一模一樣的,只是前面多加了::ttk名稱空間。換句話說之前我們學到的觀念都還是可以使用,所以別擔心我們並沒有浪費掉之前的學習。上面程式的執行的畫面如下:

圖 17-1


看到了嗎? ttk按鈕在Mac下變成了圓角形,這樣就和Mac預設的外觀更搭配了。

§ 關於ttk

ttk是在Tk8.5版以後才納入為內建命令的,所以如果你使用的是Tk8.5之前的版本,請儘快更新到最新的版本哦!! 否則的話ttk的命令都會不能使用。

17.2 加入按鈕圖示

在按鈕的文字前加上一個圖示可以讓你設計的程式看起來更賞心悅目。如果你想要在按鈕的文字前面加上圖示的話,那你要使用下面的那個步驟:

  1. 先用image命令把圖檔轉換為Tk內部使用的格式。
  2. 把轉入的圖片指定給按鈕的-image選項。

請看看下面的例子:



程式的第1行「image create photo」可以用來載入外部的圖片,-file選項後面的檔案就是要把入的圖檔。如果載入成功的話image命令會回傳一個獨一無二的資源代號來表示圖片,而這個資源代號就可以指定給其它視窗元件的-image選項。請看第2行,我們把新建立的圖片指定給按鈕的-image選項。這個程式執行起來像這樣:

圖 17-2


糟了~~文字怎麼不見了? 不要緊張,這是因為預設的情況下-image選項的內容會蓋掉-text選項的內容,如果想要並存的話只要指定-compound選項就可以了,程式改成如下:



注意程式的第2行-compound可以用來決定圖示還有文字的排放方法,指定為left表示圖示要在文字的左邊,指定為right表示要圖示在右邊,指定為top表示圖示要在上面,指定為bottom表示圖示要在下面,指定為none表示不要顯示文字。在這邊我指定了left所以程式執行起來就變成這樣:

圖 17-3


§ 關於-image選項

ttk裡有很多視窗元件都有提供-image選項,以後如果再遇到就不多說明了,請大家要記得它的用法哦!!

§ Tk 支援的圖片格式

在Tk 8.5以前的版本image create photo預設只能載入gif、ppm及pgm等圖檔,如果你要使用jpg或是png檔的話,就要引入額外的圖形支援。例如:

# 引入png圖檔的支援 
package require img::png 
# 引入jpg圖檔的支援 
package require img::jpeg

只要在使用image命令之前,執行上面的兩行程式就可以正確的載入png及jpg檔了。注意哦!! 上面兩個命令是包在Img套件裡,所以如果上面兩行執行失敗的話,請先用下面的命令安裝Img套件包:

teacup install Img

另外在8.6版以後image內建就支援png檔案格式。

17.3 製作預設按鈕

預設按鈕時常出現在對話方塊上,它的外觀和一般的按鈕不太一樣。正常的情況下如果一個對話方塊上出現了預設按鈕,通常那就意謂著「只要你在這個對話方塊上按下Enter鍵就會執行預設按鈕」。例如在Mac下預設按鈕就長得像下圖右邊的樣子:

圖 17-4


它的程式碼如下:



請注意程式的第2行,-default選項可以用來調整按鈕預設的樣式,如果是active就表示使用預設按鈕的樣式,如果是normal表示使用一般按鈕的樣式。特別注意哦!! -default只是用來指定顯示樣式而以,並不會自動讓程式在按下Enter鍵時執行預設按鈕。如果你希望按下Enter鍵時自動執行預設按鈕,可以使用下面的程式:



請特別注意到第3行,bind命令可以用來把鍵盤、滑鼠或系統的事件綁定到視窗元件上,從上面這個例子來看bind後面的「.」是要被綁定的視窗元件,而<Return>是要邦定的事件,它會在鍵盤按下Enter鍵後被觸發,接著後面大括號的內容就是事件觸發時要執行的程式碼。

我們知道.btn2被建立成功後它會變成控制視窗元件本身的命令,它的invoke的功能可以用來接執行本身-command裡的程式碼,而不用透過滑鼠的點擊。

總結上面的說明,只要我們在root視窗上按下Enter鍵,那.btn2就會被執行。關於bind命令以後會有一個專門的章節來說明,請先不要太擔心。這邊需要在意的反而是按鈕的invoke命令,它可以被用來觸發-command裡的程式。

§ 視窗元件命令

在第15章有提到,一但視窗元件建立成功,該視窗元件的path即會變為一個新的命令,而且可以用來控制視窗元件本身。像上面的invoke就是一個很好的例子,往後我們會不斷的看到像這樣子的視窗元件命令,所以請儘快把這個用法吸收起來。另外為了方便以後的說明,我會把這樣子的命令直接稱為「xx的oo命令」,例如: 按鈕的inoke命令、按鈕的cget命令、標籤的cget命令...。

17.4 其它常用的功能

事實上button和entry一樣可以使用-textvariable選項來反應button上的顯示文字。例如:



如果像上面一樣,我們把-textvariable的值設定為變數::btnText,這樣一來只要你用set命令改變::btnText的內容,那按鈕上面顯示的文字也會及時的改變。

§ 關於-textvariable選項

這個選項也是很多視窗元件都會提供的選項,所以往後再遇到它的話就不多說明了哦!!

□ 按鈕的configure命令

如果說你不想要用-textvariable的方式來改變按鈕上的文字,你也可以用按鈕的configure命令來重設-text的值,例如:



請注意到第2行-command裡的程式碼,只要按下.btn2那.btn1的-text選項值將會由Hello改為Hi。

□ 按鈕的cget命令

上面的configure命令可以用來設定選項的值,而cget命令剛好反過來,它可以用來取得按鈕的選項值。舉例來說,如果你想要取得-text的值,那你可以像這樣寫:



請注意到第2行,我用了按鈕的cget命令來取得-text選項的值,然後再透過puts命令輸出。

§ 關於configure及cget

configure及cget是所有視窗元件都會提供的標準命令,而且使用方法都一樣。在以後的章節裡它們會不斷的出現,請大家要知道它們的功能及用法!!

49 個意見

sam | 2009年11月4日 下午5:39

請問一下,圖片是不是只能嵌入到button或label顯示出來呢,我想要按一個按鈕就變換一張圖片在同一個button或label中,不過好像沒有辦法這樣作,請問一下大大,有沒有其它的方法可以達到這樣子的功效呢,謝謝,不好意思,我是新手問題比較多。

Dai | 2009年11月5日 下午7:21

類似這樣吧!!

set ::sn 1
button .btn1 -image [image create photo -file 0.png]

button .btn2 -text "next" -command {
.btn1 configure -image [image create photo -file $::sn.png]
incr ::sn
}

pack .btn1 .btn

TerryWang | 2009年12月14日 下午2:51

請問dai大..如何把button 放到左上角呢?? pack 預設的放置方向只有上下左右..

dai | 2009年12月14日 下午3:13

你是想這麼做嗎?

button .btn -text "hello"
pack .btn -anchor nw

TerryWang | 2009年12月14日 下午4:29

感恩...就是我要的..繼續研究去!!

TerryWang | 2009年12月14日 下午6:24

請問Dai大...若我想把ttk::button 顯示出來的button文字變大 又或者整個button變寬..請問該如何做呢?? ttk::button只能用pack不能用place嗎??感覺用place比較方便.因為可以從XY軸來調整!!

dai | 2009年12月14日 下午6:42

下面示範改字型還有place的用法,請參考。

ttk::style configure My.TButton -font [font create -size 24]
ttk::button .btn -style My.TButton -text "Test"
place .btn -x 100 -y 100 -width 100 -height 100

翊翾 | 2009年12月29日 上午9:59

Dai你好
我有嘗試過對Button在Style中加入-bg
但改變的只有Button外面一圈的顏色
是因為ttk::button不能改變顏色的關係嗎?
可以在問一下改變視窗背景顏色是否能改變呢?

dai | 2009年12月29日 上午10:51

嗯~你要不要試試貼一張圖上來,讓我研究一下你想要做得效果~~

翊翾 | 2009年12月29日 上午10:57

button .btn1 -text "我是藍色按鈕" -bg black -fg white
上面是我想做的
但我想使用ttk的Button,所以我嘗試以下的寫法
ttk::style configure blue.TButton -bg black -fg white
ttk::button .btn -style blue.TButton -text "Button"
就沒有辦法將整個Button反黑

至於視窗的部份 可以設定大小位置標題透明度等等
是使用wm的部份,但不知道是否能變顏色,不要是預設的灰色視窗
像是有些音樂播放軟體有著很漂亮的版面,但我不知從何修改
麻煩Dai幫我想一下 感恩^^

dai | 2009年12月29日 下午12:04

OK!! 我補捉到你的意思了,請試試下面的例子:

ttk::style configure blue.TButton -background black -foreground white
ttk::button .btn -style blue.TButton -text "Button"
pack .btn

. configure -bg blue

翊翾 | 2009年12月30日 下午12:40

^^~感謝Dai的範例~

dai | 2009年12月30日 下午1:36

不會~請不用客氣

Peter | 2010年4月20日 下午2:09

Dai 您好:
剛試一下以下程式
ttk::style configure blue.TButton -background black -foreground white
ttk::button .btn -style blue.TButton -text "Button"
pack .btn
發現TTK跟背景顏色是綁死的,沒辦法另外改嗎?

例如在翊翾程式中
button .btn1 -text "我是藍色按鈕" -bg black -fg white
pack .btn1
想在TTK語法中,作出同功能,有辦法嗎?

dai | 2010年4月20日 下午8:38

在ttk裡,你可以定義好多個theme,每一個theme裡的按鈕都是不同的顏色,然後再用

ttk::style theme use ?themeName?

來切換它們

Peter | 2010年4月23日 下午2:32

Dai 您好:
剛剛試了一下,按鈕顏色跟背景顏色有不同,
但是按鈕就像背景顏色一樣,這是本來就該這樣的嗎?
我的程式碼如下
ttk::style theme create test.TButton
ttk::style theme use test.TButton
ttk::button .btn -style test.TButton -text "Button"
不太懂如何去定義顏色
剛試過-background -fd不管怎麼試都沒有反應

請問Dai有範例可以給我參考一下嗎

sam | 2010年4月23日 下午5:51

Hi Peter:
這有一小段程式(剛無聊google了一下),但不是很完整,但大概可以了解theme的用法:


------------------------------------------------------
ttk::style theme create mytheme -parent alt -settings {
ttk::style configure "." \
-background blue \
-foreground red \
}

#ttk::setTheme classic
ttk::setTheme mytheme
ttk::button .tbd -text "Button" -default disabled -command {puts "hello A"}
button .cbd -text "Button" -default disabled -command {puts "hello B"}
ttk::button .tbn -text "Button" -default normal -command {puts "hello C"}
button .cbn -text "Button" -default normal -command {puts "hello D"}

pack .tbd .cbd .tbd .tbn .cbn -side top -fill x

------------------------------------------------------
Theme classic這個是內建的樣子,你可以試看看用這個,
Theme mytheme是自訂的,目前按下去有反應,但沒有按鈕的樣子,
我猜想應該要往TButton這邊去google看看,由於要下班了,所以…這部份就留給……

Peter | 2010年4月23日 下午6:19

Hi Sam
感謝你提供意見
你的情況跟我一樣,就是按鈕有功能,但是看起來就像背景一樣,
而且按鈕一多的話,沒辦法各自有各自的顏色,這就是TTK讓我頭
痛問題...

dai | 2010年4月23日 下午11:24

請兩位參考我的範例...Peter ttk是可以讓每一個按鈕有不一樣的style哦

ttk::style theme create theme1 -parent alt -settings {
ttk::style configure TButton \
-background blue \
-foreground red \
-padding 5 \
-relief raised

ttk::style map TButton \
-relief [list pressed sunken !pressed raised]

}

ttk::style theme create theme2 -parent alt -settings {
ttk::style configure TButton \
-background red \
-foreground yellow \
-padding 1 \
-relief groove

ttk::style map TButton \
-relief [list pressed sunken !pressed groove]

}

#ttk::setTheme classic

ttk::button .btn1 -text "theme1" -command {ttk::style theme use theme1}
ttk::button .btn2 -text "theme2" -command {ttk::style theme use theme2}


pack .btn1 .btn2 -side top -fill x -padx 5 -pady 5

Peter | 2010年4月26日 上午9:06

Dai 您好:
這就是我要的功能,感謝您的回答,
我在去嘗試其他功能,感謝!

Peter | 2010年4月26日 上午9:12

Dai 您好:
感謝您的回答,我了解該怎麼使用了,
我繼續去研究讓每一個按紐有不同變化看看..

dai | 2010年4月26日 下午5:34

提示一下...要讓每一個按鈕都不同變化,你需要為每個button指定各別的-style屬性

匿名 | 2011年12月5日 下午11:58

我是crazystudent.tw@yahoo.com.tw
非常抱歉,問一個笨問題。因應您再這篇最前面說,要升級到8.5以上。
我是linux系統,是tcl是8.4版。也安裝了tcl8.6版本。
8.4的目錄放在/share/的底下,我直接移除。
8.6版本放在/opt/底下。但是系統就是預設,使用tcl8.4版本,使得我無法用本篇::ttk的功能.....
這問題有點問linux了,系統沒玩熟,請您教導一下。

匿名 | 2011年12月6日 下午12:39

Dai兄
除了上面的問題, 還有一個小問題,通常你幫別人寫Tcl的套裝程式(範例: dave.eeye.com.tw) ,約略要多久的時間 ?

dai | 2011年12月6日 下午9:26

hi, 可以這可以換掉預設的tclsh & wish

rm /usr/bin/tclsh
rm /usr/bin/wish
ln -fs /opt/ActiveTcl-8.x/bin/tclsh86 /usr/bin/tclsh
ln -fs /opt/ActiveTcl-8.x/bin/wish86 /usr/bin/wish


dave.eeye.com.tw 是指字Tcl寫cgi嗎??

我很少用Tcl寫cgi也~~ 網頁開發我比較愛用 django 偶而用 php ~

像這樣的網站 大部份的時間會花在了解網站的功能 , 也就是客戶的需求 ~

一般來說如果客戶的需求都了解了 ~ 這樣的網站 ~ 應該1~2個星期就可以完成

匿名 | 2011年12月6日 下午11:15

太厲害了,希望認識一下。
請e-mail給我喔
crazystudent.tw@ucscert.com.tw
或上msn!!

衍州的天地 | 2012年7月9日 上午11:33

作者已經移除這則留言。

Hero Hsiao | 2013年3月14日 下午5:21

你好,請問大大我複製你的格式
set img [image create photo -file cut.gif]
::ttk::button .btn -text "圖示按鈕" -image $img -compound left
pack .btn

可是卻一直無法執行程式
我也已經安裝Activetal 8.6
couldn't open "cut.gif" no such file or directory
while executing

dai | 2013年3月15日 下午12:11

你需要有 cut.gif 這個檔案,並把它和你的程式碼放在一起。

Harry | 2013年5月2日 下午1:22

Dai大大, 你好, 有個問題想請教一下,
底下為我寫的程式:
----------------------------------------------
label .lblLength -text "Input Packet Length:"
entry .txtLength
button .btnApply -text "Apply" -command {
set j [.txtLength get]
puts "j=$j"
}
grid .lblLength .txtLength
grid .btnApply

console show

puts "12345"

----------------------------------------------
程式執行完後, 在console會先印出12345, 而再印出使用者輸入的字串

請問有辦法先印出使用者輸入的字串,再印出12345嗎?

dai | 2013年5月2日 下午7:09

我猜...你要的功能應該不是這樣:


button .btnApply -text "Apply" -command {
set j [.txtLength get]
puts "j=$j"
puts "12345"
}

Harry | 2013年5月3日 下午3:42

Dai大大說得沒錯, 我想要的結果是先讓使用者輸入一些參數, 再將這些參數帶入接下來要跑的程式,

puts "12345"只是用來測試程式run到那裡了, 請問除了將"使用者輸入參數後要跑的程式"放在-command底下,

是否還有其它方式可解決???

感謝回覆^^

dai | 2013年5月3日 下午6:16

試試:

proc btnApplyClick {} {
set j [.txtLength get]
puts "j=$j"
puts "12345"
}

button .btnApply -text "Apply" -command btnApplyClick

Harry | 2013年5月6日 上午10:50

我將原本程式修改如下:
=================================================
label .lblLength -text "Input Packet Length:"
entry .txtLength
proc btnApplyClick {} {
set j [.txtLength get]
puts "j=$j"
}

button .btnApply -text "Apply" -command btnApplyClick
grid .lblLength .txtLength
grid .btnApply

console show

puts "12345"
=================================================
執行結果還是會先印出"12345", 與我想要結果不相同.

不過沒關係, 我還是將主要程式丟到proc btnApplyClick裡面就好.

在這還是謝謝Dai大的回答^^

An Aeron | 2014年5月1日 下午2:03

作者已經移除這則留言。

An Aeron | 2014年5月2日 下午5:35

hi Dai 大,

我想請問一下~為什麼我寫的程式,現在按一個鍵都只會跑出橘色的,要怎麼樣才能按red button然後就會出現對應的紅色,按blue button就會出現對應的藍色???這是我寫的,還請大大指導一下~謝謝

from Tkinter import *

the_window = Tk()

the_window.title('ONE Button Colour')


start_color = 'grey'

button_color = ['Red', 'Green', 'Blue', 'Yellow', 'Orange']
label_colour = StringVar()
def change_colour():
if label_colour.get() == 'r':
colour['bg'] = 'red'
elif label_colour.get() == 'g':
colour['bg'] = 'green'
elif label_colour.get() == 'b':
colour['bg'] = 'blue'
elif label_colour.get() == 'y':
colour['bg'] = 'yellow'
else:
colour['bg'] = 'orange'

for r in range(5):
colour = Label(the_window, bg = start_color, compound = 'bottom',
width = 8,height = 1)
colour.grid(row=r,column=0, padx = 2, pady = 3)
Button(the_window, text = button_color[r], command = change_colour,
width = 8,height = 1 ).grid(row=r,column=1, padx = 2, pady = 7)




the_window.mainloop( )

dai | 2014年5月2日 下午10:39

可以像這樣:

from Tkinter import *

class MyButton(Button):
def __init__(self, master, **kwargs):
Button.__init__(self, master)

self.color = None
self.cb = None

for k,v in kwargs.items():
if k == 'command':
self.cb = v
self[k] = self.command
continue

if k == 'color':
self.color = v
continue

self[k] = v



def command(self):
if self.color is None or self.cb is None:
return

self.cb(self.color)


the_window = Tk()

the_window.title('ONE Button Colour')

start_color = 'grey'

button_color = ['Red', 'Green', 'Blue', 'Yellow', 'Orange']

lbls = {}

def change_colour(color):
lbls[color]['bg'] = color

for r in range(5):

c = button_color[r]

colour = Label(the_window, bg = start_color, compound = 'bottom', width = 8,height = 1)
colour.grid(row=r,column=0, padx = 2, pady = 3)
btn = MyButton(the_window, text = c, color=c, command = change_colour, width = 8,height = 1 ).grid(row=r,column=1, padx = 2, pady = 7)

lbls[c] = colour


the_window.mainloop()

匿名 | 2014年5月23日 下午6:06

請問一下, 當我按"Add", 為何要等完全執行結束才一次顯示在.pw.tv1??
如何delete .pw.tv1 裡面的資料?
謝謝!!

wm title . "you window title"
wm geometry . 800x600

proc doCLear {widget} {
$widget delete
}

proc doIt {widget} {
$widget insert {} end -text "窗格1"
after 500
$widget insert {} end -text "窗格2"
after 500
$widget insert {} end -text "窗格3"
after 500
$widget insert {} end -text "窗格4"
after 500
}

ttk::button .btn1 -text "Clear" -command {doCLear .pw.tv1}
ttk::button .btn2 -text "Add" -command {doIt .pw.tv1}
pack .btn1 .btn2

ttk::panedwindow .pw -orient horizontal
.pw add [ttk::treeview .pw.tv1]
.pw.tv1 insert {} end -text "窗格1"

pack .pw -expand 1 -fill both

dai | 2014年5月25日 下午3:17

在after 500 後面加上update , ex:

after 500 ; update


刪除的話用 destroy, ex:

destroy $widget_path

jimmy | 2014年5月26日 下午1:46

如果是要刪除treeview的item,語法是
pathname delete itemList
delete後要帶item
如果是要刪除選取的item可以
$widget delete [$widget selection]
要全部刪除可以
$widget delete [$widget child {}]

陳宗聖 | 2015年1月16日 下午3:33

請問一下喔 為什麼同樣的Code 我直接執行main.tcl可以成功
但是使用ezdit卻會載圖失敗?

TerryWang | 2015年3月16日 下午4:51

Dear Dai大,
想請問一下你之前給peter的範例問題..
ttk::style theme create theme1 -parent alt -settings {
ttk::style configure TButton \
-background blue \
-foreground red \
-padding 5 \
-relief raised

ttk::style map TButton \
-relief [list pressed sunken !pressed raised]

}

ttk::style theme create theme2 -parent alt -settings {
ttk::style configure TButton \
-background red \
-foreground yellow \
-padding 1 \
-relief groove

ttk::style map TButton \
-relief [list pressed sunken !pressed groove]

}

#ttk::setTheme classic

ttk::button .btn1 -text "theme1" -command {ttk::style theme use theme1}
ttk::button .btn2 -text "theme2" -command {ttk::style theme use theme2}


pack .btn1 .btn2 -side top -fill x -padx 5 -pady 5

在這個範例中若按下btn1或btn2 是一次將兩個button換成同一個顏色
若我希望兩個按鈕分別是不同顏色該如何做呢?
我使用-style xx.TButton都只能更改button的外圍顏色..沒有整個換成我要的按鈕顏色!!

匿名 | 2016年3月24日 上午9:32

早上發的問題竟然消失了........

匿名 | 2016年3月25日 上午8:53

我設計了一個按鈕視窗,每個按鈕都有不同的執行程式,當我點擊按鈕時會執行程式,此時按鈕會下陷並使按鈕視窗無法被點擊,此時若持續點擊視窗按鈕,滑鼠的點擊會被記憶,當我結束執行的程式時,會依序執行剛才滑鼠點擊的按鈕。

匿名 | 2016年3月25日 上午8:53

我嘗試在按鈕的-command後方加入&,此時點擊按鈕時會執行程式,同時按鈕會跳起,並可持續點擊其他按鈕,但這並不是我想看見的,我想要的是,當我點擊某按鈕並執行該按鈕所設定的程式時,其他的按鈕是被限制無法點擊的,請問Dai前輩該如何設定呢?
感謝您

匿名 | 2016年3月25日 下午4:53

可以設計一個flag參數,並在執行完該command時恢復flag的預設值。
其他的按鈕可依照flag的value,用if來判斷command執行完了沒,若還沒執行完就return出來。

匿名 | 2016年3月28日 上午10:40

請問前輩flag和return是什麼語言的?我目前的程式是用Tcl+Bash寫的,以Bash為主,套用Tcl的按鈕

匿名 | 2016年3月28日 下午3:33

假設有一個sh的script其內容為sleep 5; echo done
我們用一個tcl的wish script:
set hand [open "| sh cc.sh"]
set flag 0
proc ge {hand} {
global flag
puts [read $hand]
if {[eof $hand]} {set flag 1; close $hand; puts ok}
}
fileevent $hand readable {ge $hand}
button .b -text hello -command {if $flag {puts hello}}
pack .b
它會用5秒執行cc.sh程式。
並且執行完畢以前,你按的按鈕沒有動作。

匿名 | 2016年3月28日 下午5:15

感謝前輩~研究一下如何將您的程式修改後套用到我的程式來

留下您的意見

Theme Design by devolux.org. Converted by Wordpress To Blogger for WP Blogger Themes. Sponsored by iBlogtoBlog
This template is brought to you by : allblogtools.com | Blogger Templates