PySimpleGUI - 事件



任何 GUI 應用程式都是事件驅動的,能夠響應 GUI 元素上發生的各種可能的事件。在 PySimpleGUI 中,事件處理是在 GUI 設計構建之後的無限迴圈內完成的,持續檢查是否發生事件並根據事件執行操作。

事件主要分為兩種型別:

  • 視窗事件,以及

  • 元素事件。

視窗事件預設啟用,包括按鈕事件(任何按鈕被點選時發生)和標題欄上的“X”按鈕被點選的事件。

元素事件預設不啟用。只有在建立元素時將“enable_events”引數設定為 True 時,才能檢測到特定於元素的事件。

視窗關閉事件

使 PySimpleGUI 視窗保持存在的無限事件迴圈,在使用者按下“X”按鈕或執行 Window 類的 close() 方法時終止。終止迴圈的標準方法如下:

import PySimpleGUI as psg
...
while True:
 ...

   if event == psg.WIN_CLOSED:
      break
 ...
window.close()

如果將此引數設定為 True,Widow 類還會發出“enable_close_attempted_event”。在迴圈內部檢測到它時,呼叫是/否彈出視窗是一個好習慣。

window = psg.Window('Calculator', layout,  enable_close_attempted_event=True)
while True:
   event, values = window.read()
   print(event, values)
   if event == "Add":
      result = int(values['-FIRST-']) + int(values['-SECOND-'])
   if event == "Sub":
      result = int(values['-FIRST-']) - int(values['-SECOND-'])
   window['-OUT-'].update(result)
   if event == psg.WINDOW_CLOSE_ATTEMPTED_EVENT and psg.popup_yes_no('Do you really want to exit?') == 'Yes':
      break
   if event == psg.WIN_CLOSED or event == 'Exit':
      break

在這種情況下,當按下“X”按鈕時,會出現帶有是/否按鈕的彈出視窗,當點選“是”按鈕時程式退出。

它將生成以下輸出視窗:

Window Closed Event

事件值還會返回“-WINDOW CLOSE ATTEMPTED-”值。

-WINDOW CLOSE ATTEMPTED- {'-FIRST-': '200', '-SECOND-': '300'}

按鈕事件

按鈕點選事件預設啟用。要停用,請使用“Button.update(disabled=True)”。您也可以在 Button 的建構函式中設定“enable_events=True”,它將啟用 Button Modified 事件。當某些內容“寫入”按鈕時,將觸發此事件。

當我們讀取視窗的內容(使用“window.read()”)時,按鈕值將是其標題(如果未設定鍵)或鍵(如果已設定)。

在上面的示例中,由於未在 Add 和 Sub 按鈕上設定 key 引數,因此在讀取視窗時會返回它們的標題。

Add {'-FIRST-': '200', '-SECOND-': '300'}

在程式中向 Add 和 Sub 按鈕新增 key 引數。

import PySimpleGUI as psg
layout = [
   [psg.Text('Enter a num: '), psg.Input(key='-FIRST-')],
   [psg.Text('Enter a num: '), psg.Input(key='-SECOND-')],
   [psg.Text('Result : '), psg.Text(key='-OUT-')],
   [psg.Button("Add", key='-ADD-'), psg.Button("Sub", key='- SUB-'), psg.Exit()],
]
window = psg.Window('Calculator', layout)
while True:
   event, values = window.read()
   print(event, values)

   if event == "-ADD-":
      result = int(values['-FIRST-']) + int(values['-SECOND-'])

   if event == "-SUB-":
      result = int(values['-FIRST-']) - int(values['-SECOND-'])

   window['-OUT-'].update(result)

   if event == psg.WIN_CLOSED or event == 'Exit':
      break
window.close()

read() 方法返回的元組現在將顯示所按按鈕的鍵。

-ADD- {'-FIRST-': '200', '-SECOND-': '300'}

其他元素的事件

許多元素在發生某種型別的使用者互動時會發出事件。例如,當移動滑塊時,或從列表中選擇一個專案,或點選一個單選按鈕。

與 Button 或 Window 不同,這些事件預設不啟用。要為元素啟用事件,請設定引數“enable_events=True”。

下表顯示了元素及其生成的事件。

名稱 事件
InputText 按下任何鍵
Combo 專案被選中
Listbox 選擇更改
Radio 選擇更改
Checkbox 選擇更改
Spinner 新專案被選中
Multiline 按下任何鍵
Text 點選
狀態列 點選
圖形 點選
圖形 拖動
圖形 拖動結束(滑鼠抬起)
TabGroup 標籤被點選
Slider 滑塊移動
Table 行被選中
Tree 節點被選中
ButtonMenu 選單項被選中
右鍵選單 選單項被選中
廣告

© . All rights reserved.