#

這一篇文章介紹Tk建立功能選單的命令,內容包含建立功能選單列(menubar)、快顯功能選單(popupmenu)等,然後再依序說明如何在這些選單上加入命令、核取方塊、圓鈕方塊及子選單等項目。

34.1 建立功能選單列

在Tk裡每一個用toplevel命令建立的視窗及root視窗都可以指定一個功能選單列,如下示範建立功能選單列方法,並且把功能選單列指定給root視窗:



程式第1行的menu命令建立了一個選單,而且指定他的類型是功能選單列(menubar),-type可以指定的類型有menubar、tearoff及normal,其中tearoff指的是要建立一個可以分割的選單,這種選單上會有一條分割線,若使用者按下分割線選單就會由功能選單列脫離,並且變成一個新的視窗。

程式的第3~4行用.mbar的add命令加入「檔案」及「編輯」等兩個用來串接選單的項目,最後一行再用root視窗的configure命令把.mbar指定給自己。

這個程式執行起來像下面的圖,功能選單列上會有檔案及編輯兩個項目,但由於程式沒有指定對應的下拉選單給它們,所以執行的時候,不管你怎麼按都不會有選單跳出來。

圖 34-1


接下來我們要幫「檔案」這個項目加上下拉選單,下拉選單的建立方法也是使用menu命令,只是這次不需要指定-type。



程式的第2行建立了第2個選單,然後在第4行用-menu選項把它指定給「檔案」項目作為下拉選單。程式的第7~9行使用選單的add命令建立了2個命令(command)項目及一個分隔線(separator)項目。-label選項用來指定顯示在項目上的文字,-command用來指定按下選單項目要執行的命令。

它執行的畫面如下,由於這次我們幫「檔案」串接了下拉選單,所以按下「檔案」選單就跳出來了。

圖 34-2


若你按一下分割線,menu就會變成一個獨立的視窗:

圖 34-3


若你不喜歡分割線的話建立menu時指定-tearoff 0這樣就不會顯示分割線了,像這樣:



我們也可以用add cascade幫.mbar.file建立更下一層的子選單,例如:



程式的第3行再建立一個新的選單,然後在第10行用add cascade把它串接給「子選單」項目做為它的下拉選單。它的執行畫面如下:

圖 34-4


依此類推我們就可以建立第4層、第5層...的子選單。

34.2 調整選單項目的外觀

除了可以用-label來指定選單項目要顯示的文字之外,我們還可以用-image及-compound來指定選單項目上要顯示的圖示,它們的使用方法和第17章 button所說的是一樣的,例如:



程式的第9行我載入了exit.gif圖檔並指定給「離開」項目,而且exit圖示要放在文字的左邊。執行畫面如下:

圖 34-5


如果想要做更多的變化還可以調整選單項目的顏色及文字的字型,例如:



請看到程式的8~12行,-background用來指定選單項目的背景顏色,-foreground用來指定前景(文字)的顏色,-active開頭的兩個選項用來指定滑鼠移過時的背景及前景顏色,最後-font用來指定項目上文字的字型。執行畫面如下:

圖 34-6


當滑鼠移經「第二層」項目時就變成這樣:

圖 34-7


34.3 核取方塊及圓鈕方塊選項

Tk的menu也允許你放上核取方塊(checkbutton)及圓鈕方鈕(radiobutton),它們的原理和使用方法和一般的checkbutton及radiobutton是類似的,只是變成放在選單項目上,加入核取方塊的範例如下:



程式的9~11行建立了3個核取方塊,並且用::chkvar1到::chkvar3記錄各別的勾選狀態,-onvalue後面的1是勾選時要儲存到對應的::chkvarX的值,反之取消勾選時-offvalue後面的0會被存到::chkvarX,-command後面的程式會在勾選狀態改變時執行。它的執行畫面如下,在 「第2層」及「離開」的中間多了3個核取方塊的項目。

圖 34-8


加入圓鈕方塊的示範如下:



程式的9~10行建立了2個圓鈕方塊,並用::rdovar記錄圓鈕方塊的選取狀態,-value後面的值是圓鈕方塊被選中時要儲存在::rdovar變數的值,-command後面的程式會在圓鈕方塊被點選時執行。

它的執行畫面如下:

圖 34-9


34.4 快顯功能選單

建立快顯功能選單和建立功能選單列的下拉選單是一模一樣的,唯一的不同只有在於快顯功能選單是在特定的視窗元件上按滑鼠右鍵才顯示,而且要指定顯示的X,Y座標,以下是一個簡單的例子,這個例子建立一個entry視窗元件,然後在entry上按滑鼠右鍵時會顯示清除的功能。



這個程式的重點在於最後一行,.txt綁定了一個Button-3(滑鼠右鍵)的事件,然後使用tk_popup命令把.txt.m選單顯示在坐標(%X,%Y)的位置。在程式真正執行的時候%X及%Y會被bind命令代換為滑鼠指標在螢幕上的真實座標。注意哦!! 如果你是使用Mac的系統,也許要把Button-3換成Button-2。

程式的執行畫面如下:

圖 34-10

13 個意見

sam | 2010年2月5日 上午11:39

Dai大大:
不好意思提醒大大一下,最後一張圖片的路徑好像是"圖34-10" http://got7.org/docs/b34/34-10.png,^^

dai | 2010年2月5日 下午1:05

唉呀~~ 不好意思,貼錯了 > <。 謝謝提醒。

isPeter | 2010年11月30日 下午5:07

Hello dai,

有錯字, "menuar" ==> "menubar"

dai | 2010年12月1日 晚上11:16

真是好眼力~~~謝啦!!

honkiaa | 2012年6月24日 上午10:36

請問大大,有沒辦法做出 4*4 選項 的選單?感恩

匿名 | 2012年6月24日 晚上10:27

不好意思~~~請問您指的4*4是指??

可以舉個例子說明嗎?

匿名 | 2014年1月6日 下午5:22

如果一開始我把其中一個選項設為disable
之後在程式中該如何改成normal的狀態
謝謝

匿名 | 2014年1月6日 晚上9:04

像這樣,假設你menu中的功能項目是位於第3個位置(由0開始算) :

.mbar.file entryconfigure 3 -state normal



steve | 2014年1月7日 上午9:24

感謝 dai
我昨天試了上百種方法 你瞬間就解決了!!!
很感謝你的網頁寫的那麼完整
很多技巧書上還不一定有提到!!!
超級感謝!!!

Hzing | 2014年3月19日 晚上11:48

請問大大,
在圖34-2, 如果想對"第二層"設定快速鍵 (如 Ctrl+x), 要如何做呢?
就是在鍵盤敲 Ctrl+x, 就直接執行"第二層"功能, 不必先選"檔案"再選"第二層".
謝謝.

匿名 | 2014年3月20日 晚上7:51

bind . {.mbar.file invoke 0}

匿名 | 2020年10月15日 下午5:19

你好,有些程式碼好像看不到了??

Glenn | 2020年12月22日 晚上9:27

你好 程式碼似乎已經都看不到了 謝謝

留下您的意見

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