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()

選單欄下方放置了兩個多行元素。最後一行有一個文字元素。

單擊任何選單選項按鈕時,生成的事件就是該按鈕的標題。此標題將顯示在最後一行中的文字標籤上。請參考下圖:

Menu Bar Display

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

Menu Bar Edit

帶有熱鍵的選單按鈕

要將選單按鈕與鍵盤上的鍵對映,請在所需字元前加上 & 字元。例如,在“檔案”前加上 &,使字串變為“&檔案”。這樣做後,可以透過按“Alt+F”鍵訪問“檔案”選單。“F”鍵被稱為熱鍵。

將熱鍵新增到我們選單定義中的選單按鈕。

menu_def = [
   ['&File', ['&New', '&Open', '&Save', 'E&xit',]],
   ['&Edit', ['C&ut', '&Copy','&Paste', '&Undo'],],
   ['&Help', '&About...'],
]

執行程式碼後,選單中的熱鍵將顯示為帶下劃線的字元。

Menu Button Hot Key

右鍵單擊選單

此選單與位於應用程式視窗頂部的選單欄分離。每當使用者按下滑鼠右鍵按鈕時,此選單都會彈出到點選位置。

在上文定義的選單欄中,每個列表都是單個選單的定義。可以透過建構函式中的 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)

進行這些更改並執行程式碼。單擊視窗中的任何位置。選單將彈出,如下所示:

Right Click Menu

按鈕選單

此選單類似於右鍵單擊選單,只是它附加到按鈕,並在單擊按鈕時彈出。

在主佈局的最後一行,我們新增一個 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-')]
]

單擊右下角的按鈕時,選單將彈出,如下圖所示:

ButtonMenu
廣告