
- PySimpleGUI 教程
- PySimpleGUI - 首頁
- PySimpleGUI - 簡介
- PySimpleGUI - 環境搭建
- PySimpleGUI - Hello World
- PySimpleGUI - 彈出視窗
- PySimpleGUI - 視窗類
- PySimpleGUI - 元素類
- PySimpleGUI - 事件
- PySimpleGUI - 選單欄
- PySimpleGUI - Matplotlib 整合
- PySimpleGUI - 使用 PIL
- PySimpleGUI - 偵錯程式
- PySimpleGUI - 設定
- PySimpleGUI 有用資源
- PySimpleGUI - 快速指南
- PySimpleGUI - 有用資源
- PySimpleGUI - 討論
PySimpleGUI - 選單欄
大多數桌面應用程式都具有菜單系統,可以根據使用者在選單中選擇的選項觸發不同的操作。在典型的應用程式視窗中,選單欄位於標題欄下方和視窗客戶區上方。
選單欄是一個由可點選按鈕組成的水平條。當單擊這些按鈕中的任何一個時,它會生成一個選項按鈕的下拉列表。此類選項按鈕會觸發一個點選事件,該事件可以在事件迴圈內處理。
菜單系統的設計方式與窗口布局的指定方式相同。它也是一個列表的列表。每個列表都包含一個或多個字串。第一級列表的起始字串是出現在水平選單欄中的按鈕的標題。其後是下拉選單中選項按鈕的標題字串列表。這些選項標題位於第一級列表內的列表中。
您可能在選項按鈕下有一個子選單,在這種情況下,標題將放在第三級列表中。同樣,標題可以巢狀到任何級別。
選單定義的通用格式如下所示
menu_def = [ ['Memu1', ['btn1', 'btn2', 'btn3', 'btn4',]], ['menu2', ['btn5', 'btn6','btn7', 'btn8'],], ]
要將菜單系統附加到 PysimpleGUI 視窗的主佈局,請將 Menu 物件放在佈局的第一行。
Menu 建構函式以 **menu_def** 列表作為引數。可以在包含 Menu 物件的行之後給出主佈局的其他行。
layout= [[psg.Menu(menu_def),[..], [..]]
在下面給出的程式碼中,我們有一個帶有“檔案”、“編輯”和“幫助”選單的選單欄,每個選單欄中都有一些選單按鈕。
import PySimpleGUI as psg menu_def = [['File', ['New', 'Open', 'Save', 'Exit', ]], ['Edit', ['Cut', 'Copy', 'Paste', 'Undo'], ], ['Help', 'About...'], ] layout = [[psg.Menu(menu_def)], [psg.Multiline("", key='-IN-', expand_x=True, expand_y=True)], [psg.Multiline("", key='-OUT-', expand_x=True, expand_y=True)], [psg.Text("", key='-TXT-', expand_x=True, font=("Arial Bold", 14))] ] window = psg.Window("Menu", layout, size=(715, 300)) while True: event, values = window.read() print(event, values) if event != psg.WIN_CLOSED: window['-TXT-'].update(values[0] + "Menu Button Clicked") if event == 'Copy': txt = window['-IN-'].get() if event == 'Paste': window['-OUT-'].update(value=txt) if event == psg.WIN_CLOSED: break window.close()
選單欄下方放置了兩個多行元素。最後一行有一個文字元素。
單擊任何選單選項按鈕時,生成的事件就是該按鈕的標題。此標題將顯示在最後一行中的文字標籤上。請參考下圖:

當發生“複製”事件時,帶有“-INkey”的上方多行框中的文字將儲存在 txt 變數中。之後,當按下“貼上”按鈕時,“-OUT-”框將使用 txt 的值更新。

帶有熱鍵的選單按鈕
要將選單按鈕與鍵盤上的鍵對映,請在所需字元前加上 & 字元。例如,在“檔案”前加上 &,使字串變為“&檔案”。這樣做後,可以透過按“Alt+F”鍵訪問“檔案”選單。“F”鍵被稱為熱鍵。
將熱鍵新增到我們選單定義中的選單按鈕。
menu_def = [ ['&File', ['&New', '&Open', '&Save', 'E&xit',]], ['&Edit', ['C&ut', '&Copy','&Paste', '&Undo'],], ['&Help', '&About...'], ]
執行程式碼後,選單中的熱鍵將顯示為帶下劃線的字元。

右鍵單擊選單
此選單與位於應用程式視窗頂部的選單欄分離。每當使用者按下滑鼠右鍵按鈕時,此選單都會彈出到點選位置。
在上文定義的選單欄中,每個列表都是單個選單的定義。可以透過建構函式中的 right_click_menu 引數將此類單個選單定義附加到任何元素。在構造主視窗物件時也可以傳遞此引數。
讓我們使用 rightclick 作為與“編輯”選單對應的列表的變數。
rightclick=['&Edit', ['C&ut', '&Copy','&Paste', '&Undo']] menu_def = [ ['&File', ['&New', '&Open', '&Save', 'E&xit',]], rightclick, ['&Help', '&About...'], ]
將其用作 Window 建構函式中 right_click_menu 引數的值。請參見以下程式碼片段:
window=psg.Window("Menu", layout, size=(715, 300), right_click_menu=rightclick)
進行這些更改並執行程式碼。單擊視窗中的任何位置。選單將彈出,如下所示:

按鈕選單
此選單類似於右鍵單擊選單,只是它附加到按鈕,並在單擊按鈕時彈出。
在主佈局的最後一行,我們新增一個 ButtonMenu 元素並使用 rightclick 列表作為其佈局。
layout= [ [psg.Menu(menu_def)], [psg.Multiline("", key='-IN-', expand_x=True, expand_y=True)], [psg.Multiline("", key='-OUT-', expand_x=True, expand_y=True)], [psg.Text("", key='-TXT-', expand_x=True, font=("Arial Bold", 14)), psg.ButtonMenu('ButtonMenu', rightclick, key='-BMENU-')] ]
單擊右下角的按鈕時,選單將彈出,如下圖所示:
