[TOC]
# Menus
PAGE支持頂層菜單欄和上下文菜單,通常稱為彈出菜單。 PAGE不支持菜單按鈕。
彈出菜單本質上是綁定到所選小部件的回調函數。當然,該綁定是使用“綁定窗口”指定的。
有一個菜單編輯器,可幫助創建和修改PAGE的所有菜單。
菜單欄的創建可能會造成混淆,因為PAGE橋接了Tcl和Python。讓我嘗試解釋一下!創建頂層窗口并填充它時,實際上是在構建交互式tcl程序,該程序隨后將轉換為Python模塊。如果用按鈕填充頂層窗口小部件,PAGE會以這種方式綁定按鈕1,從而在您單擊按鈕時會發生各種魔術:“屬性編輯器”(Attribute Editor)會打開,并且菜單可能會彈出,允許您剪切和復制,指定綁定,等等-您實際上并未調用與該按鈕相關聯的任何回調。
使用菜單欄,情況有所不同,因為菜單在tcl世界中確實起作用。也就是說,如果您在菜單欄中指定了一個級聯子菜單,例如File,然后單擊菜單欄中的File,則會打開級聯菜單,以便您可以看到它。我認為這很好,因為它允許您在創建菜單時看到菜單欄的結構。但是,如果您輸入諸如Quit之類的命令條目并將其與要在Python世界中實現的函數“ quit”綁定,然后在PAGE中單擊菜單中的Quit,則Tcl / Tk將嘗試執行“放棄”。但是,在PAGE中沒有定義tcl“退出”功能。因此,您將看到一個錯誤窗口,指出“無效的命令名稱”退出”。為避免出現這種令人困惑的錯誤消息,我在4.8.9版中更改了PAGE,以在“菜單編輯器”窗口中未顯示的“#”前面添加到在菜單編輯器中輸入的實際命令,以便在菜單中選擇一個命令。禁止評論被調用,即什么也沒發生;這是一條評論。創建Python代碼時,“#”為。當然,刪除。這些修改對新指定或修改的菜單命令有效。使用較早版本指定的菜單命令仍會引起該錯誤。如果看到這樣的錯誤消息,則可以放心地選擇“確定”并繼續使用PAGE,或者可以更改有問題的命令條目-就像我對示例所做的一樣,只需一個字符即可-然后繼續。
上下文(彈出)菜單不會引起混淆,因為它們是回調函數,因此在PAGE中從不可見。
## 菜單創建
我最常使用的菜單功能是頂層窗口頂部的菜單欄。
**要創建菜單欄**, 可以通過以下幾種方式之一調用菜單編輯器:
1. 選擇頂層窗口,然后選擇click-to-edit菜單
field in the Attribute Editor,
2. 右鍵單擊“頂級”窗口小部件,然后選擇 Widget->Edit Menu,
3. 右鍵單擊“小部件樹”中的“頂級”小部件,然后選擇 Widget->Edit Menu.
當您編輯菜單時,您將看到菜單欄更改出現在“頂層小部件”中。 您將看不到任何級聯菜單。
要創建彈出菜單,請在Widget工具欄中選擇Popupmenu窗口小部件,然后在頂層窗口中單擊。頂層窗口中不會出現任何窗口小部件,但是窗口小部件樹中會出現帶有標簽“ Menu:Popupmenu \<n>”的菜單圖標。然后在“小部件樹”中右鍵單擊該Popupmenu小部件圖標,然后選擇“小部件”->“編輯菜單”。您還可以選擇Popupmenu小部件,然后選擇“屬性編輯器”中的\<click-to-edit>菜單字段。沒有Popupmenu小部件出現在頂層窗口中,因為那沒有任何意義。 Popupmenu窗口小部件具有可以在“屬性編輯器”中修改的屬性,例如顏色,字體和命令。在編輯彈出菜單時,在PAGE窗口中將看不到任何更改。您可以具有多個彈出窗口,并且一個彈出窗口可以與多個控件相關聯。彈出菜單稱為Popupmenu1,Popupmenu2等。反過來,它們在稱為popup1,popup2等的相應類函數中實現。這些特殊名稱應視為保留供PAGE使用。
請注意,雖然“小部件樹”將菜單欄顯示為頂級小部件的子小部件,但是上下文小部件顯示為根小部件的子小部件。區別在于,上下文菜單僅通過將事件(通常是鼠標按鈕)綁定到子控件來與子控件關聯。
## 菜單編輯器
菜單編輯器創建和修改菜單。 如上調用。
菜單中的某些項目可能是簡單的命令,例如“ Quit”(退出),它會調用您的退出功能。 其他是諸如文件之類的級聯菜單,它們是諸如“新建”,“打開”,“保存”等項的子菜單。要指定類似“退出”示例的操作,
* 選擇左側字段頂部的 \<Menu> 項目.
* Insert->Command.
* Select the entry “New Command”.
* 轉到編輯器右側的標簽條目,并將標簽更改為“退出”,然后按Enter鍵。
* 轉到命令條目,然后輸入quit命令的名稱,然后按回車鍵。
* 您可以更改菜單編輯器右窗口中顯示的任何選項,例如背景色,字體等。
* 通過選擇圖像選項右邊的省略號并使用文件打開對話框選擇圖像文件,將圖像添加到菜單項。
* 使用箭頭按鈕或“移動”菜單根據需要向上或向下移動選擇。
要放入“文件”之類的級聯菜單,
* 選擇左側字段頂部的 \<Menu> 項目.
* Insert->New Cascade.
* 轉到右側的標簽條目,然后輸入文件。
* 使用箭頭按鈕或“移動”菜單根據需要向上或向下移動選擇。
要將“打開”添加到“文件”菜單,
* Select File on the left.
* Insert->Command
* Select “New Command”
* Change its name as above.
* Specify the command as above.
* Move it up or down as desired.
當然,您可以將級聯菜單添加到級聯菜單等。完成所有操作后,請單擊右側的“檢查”按鈕。菜單編輯窗口重復如下:

將條目添加到級聯菜單時,該條目可以是另一個級聯菜單。請參閱下面示例的參考。
創建菜單時,可以先添加最常見的命令,也可以添加指向第二級菜單的級聯菜單。一些用于菜單欄的Tcl文檔表明,只應該將級聯項放在一個菜單欄中。但是,我發現在菜單欄中包含各種項目是非常有用和直觀的。
菜單編輯器允許更改單個菜單項的各種顏色以及單個項的字體。此外,還應該能夠設置菜單字體、前景和背景顏色的默認值的首選項。偏好處理就是這樣。我不允許設置活動前景或背景值的首選項。設置在“字體和顏色”選項卡中;在主頁面菜單中,轉到“文件”->“首選項”->“字體或文件”->“首選項”->“顏色”。
有關將圖像添加到菜單項的要點:
* 此時,Tkinter僅適用于文件中的GIF,PNG或PGM / PPM圖像。 例如,如果您有一個jpeg,則必須將其轉換為一種可接受的格式。
* 同樣,在將圖像添加到菜單中并且您也有文本時,有必要在復合屬性中設置適當的值,以告訴PAGE圖像相對于文本位于左側,右側,頂部,底部還是中央。 同樣,雖然可以在圖像輸入字段中插入一個圖像名稱,但不建議這樣做,并且該字段已被涂成橙色,作為警告。
* 在XP下,menu.py示例在Linux Mint下無法正常運行。 具體來說,為菜單欄的左按鈕指定的圖像和標簽被替換為“(圖像)”。 我貿然認為這是Tk錯誤。
menu.tcl包含在examples子目錄中,以說明我為測試菜單欄功能所做的一些事情。 加載它,生成Python并執行它。 我編寫了該示例,以測試菜單字體和顏色的更改以及具有多個圖像和多個級別的級聯菜單。 我當然不主張到處使用怪異的圖像,顏色和字體。 但是你可以。
我不確定處理菜單中字體的最佳方法。現在,PAGE設置了一個變量,該變量用作默認菜單字體,并且該規范在菜單中的其他任何地方都被強制執行,否則未進行其他指定。但是,一旦指定,它就是固定的。如果不重新指定使用位置,則無法更改它。我可能會再討論這個問題。
單選菜單項類型具有“值”和“變量”選項,需要注意。選擇單選按鈕時,變量將設置為value。也就是說,如果選中單選按鈕,則變量為x且值為a,則x設置為a。菜單編輯器的工作方式是,當將單選條目添加到菜單時,標簽和值設置為“ NewRadio”,變量設置為“ selectedButton”。如果要使用變量設置,則必須將變量更改為其他值,即您要使用的值。 PAGE將更改以創建正確的Tkinter變量類型字符串類型。它還將威脅value字段的值作為字符串常量。將該字段更改為適合您的應用程序的值。切記,菜單中的無線電條目必須都共享一個單一變量。
檢查菜單條目類型具有選項“ onvalue”,“ offvalue”和“ variable”,與單選條目非常相似。主要區別在于檢查條目期望每個條目將具有其自己的變量。他們沒有共享。同樣,PAGE將變量實現為StringVar對象,將“ onvalue”和“ offvalue”實現為字符串常量。通過在命令選項中指定不同的功能或使用lambda函數將不同的參數傳遞給命令功能,可以繞過與菜單關聯的變量。
## 菜單欄修改
要修改菜單欄,需要打開菜單欄的菜單編輯器。可以這樣做的幾種方式。
打開菜單編輯器的一種方法是使用button-1在小部件樹中選擇菜單小部件,然后在屬性編輯器窗口中選擇\<click to edit>字段。屬性編輯器還可用于更改菜單字體、菜單顏色等。
另一種方法是使用button-3在小部件樹中選擇菜單小部件。然后選擇小部件->編輯菜單….
另一種方法是選擇TopPress小部件,然后在屬性編輯器中的菜單標簽旁邊的“點擊編輯”>字段。
另外,用button-3在widget樹中選擇頂層widget,然后選擇widget->edit菜單欄。
## 彈出菜單綁定
最后要討論的主題是將彈出菜單綁定到各個小部件。彈出菜單通常由綁定到特定窗口小部件的鼠標事件激活。 Tk文檔討論了鼠標事件與不同操作系統的小部件的綁定,以及PAGE嘗試遵循這些約定的PAGE。這是上述黑客之一。注意,GUI可以具有一個以上的上下文菜單,并且一個控件可以綁定到一個上下文菜單。作為后者的示例,請參見[Lib Demo](),這是一個像相冊一樣的示例,它顯示許多縮略圖圖像,每個縮略圖圖像都可以調用相同的彈出菜單。
PAGE將彈出窗口的回調函數實現為頂級類的類方法,因為這些函數是由PAGE生成的。其他回調函數在支持模塊中作為骨架函數生成。上下文菜單的回調函數和菜單本身具有特殊名稱。上下文菜單具有PAGE生成的名稱,如Popupmenu1,Popupmenu2等,并且包含的??回??調函數為popup1,popup2等。后者的名稱保留用于pupup回調函數。這是上一段提到的黑客的一部分。由于菜單名稱和回調名稱Popupmenu \<n>和popup \<n>之間存在密切關系,因此請勿修改菜單別名。
傳遞給彈出例程的事件對象包含有關打開菜單的事件的大量信息,請參見[事件對象]()。但是,有時您希望將參數從GUI通過彈出菜單傳遞給支持模塊中的回調例程。就是這樣彈出菜單的def語句如下所示:
~~~
def popup1(event, *args, **kwargs):
~~~
因此,使用綁定菜單,可以使用以下方式將Button-3事件綁定到彈出菜單:
~~~
self.Button1.bind('<Button-3>', lambda e: self.popup1(e,1))
~~~
使用綁定菜單:

并在彈出菜單中將command屬性設置為類似以下內容:
~~~
lambda:zzz(args[0])
~~~
結果是,當使用\<Button-3>選擇窗口小部件Button1時,將出現彈出窗口,并且如果選擇了適當的命令,則將使用參數“ 1”調用函數zzz。 看到[Popup example ‘positional’](file:///C:/Program%20Files/page/docs/html/examples.html#popup).
如果將彈出菜單綁定到窗口小部件,則該菜單適用于該窗口小部件的所有子窗口小部件。 因此,如果將彈出菜單綁定到頂層小部件,并且還將另一個彈出菜單綁定到子小組件,則說一個按鈕,然后單擊彈出按鈕,在Linux中為Button-3,這兩個菜單都會彈出。
## 復制和粘貼菜單
當前,復制和粘貼僅在借用功能的上下文中適用于菜單欄。 因此,請參閱從現有項目中借用小部件以獲取詳細信息。我還沒有查看復制和粘貼彈出菜單。
- 介紹
- 更新記錄
- X Concepts
- Visual Tcl
- 使用PAGE設計范例
- 項目目錄配置
- Python 2 or Python 3
- Python編碼和UTF-8
- 使用PAGE的簡短說明
- PAGE的狀態
- 安裝
- PAGE界面
- 主菜單
- 子菜單
- 組件工具欄
- 屬性編輯器
- 組件樹
- 綁定操作窗口
- 菜單編輯器
- 首選項窗口
- Python控制臺
- 回調窗口
- 應用窗口
- 顏色對話框
- 顏色
- 雙顯示器
- 默認值和首選項
- Preferences Windows
- Color Preferences
- Font Preferences
- 模塊結構
- 風格和主題
- 使用PAGE
- 命名約定
- 概述
- Toplevel Geometry
- 別名
- 氣球幫助-工具提示
- 選擇和修改組件
- 修改組件位置和尺寸
- 鎖定組件
- 填充容器
- 剪切,復制和粘貼
- Stash and Apply - Propagate Widget Options
- 菜單組件
- 回調函數
- 將事件鏈接到回調函數
- 創建綁定
- 為滾動組件創建綁定
- 定義回調函數
- 查看回調
- 指定字體
- Toplevel Widget
- 相對位置
- Tkinter變量類
- Ttk Widgets
- Scrolled Widgets
- Ttk Notebook and PNotebook
- Ttk Panedwindow
- Ttk Treeview
- Entry
- Ttk Entry
- Ttk Combobox
- Radiobuttons
- 文本和變量的奇異性
- Label
- Listbox
- Spinbox
- Scale and TScale
- TSeparator
- Sizegrip
- Custom Widgets
- Canvas
- 生成,檢查和運行Python GUI
- 創建和保存代碼模塊
- 檢查生成的Python模塊
- 執行Python模塊
- 將生成的Python模塊加載到IDE中
- 具有多個頂級Windows的應用程序
- 修改光標
- 使用圖像
- 動態組件
- 菜單
- 重建
- 自動更新支持模塊
- 重用
- 模板
- 從現有項目中借用組件
- 范例
- 結語