PySimpleGUI - 事件


任何 GUI 应用程序都是事件驱动的,能够响应 GUI 元素上发生的各种可能的事件。在 PySimpleGUI 中,事件处理是在 GUI 设计构成下的无限循环内完成的,不断检查事件是否发生并根据事件执行操作。

有两种类型的事件 -

  • 窗口事件,以及

  • 元素事件。

窗口事件默认启用,包括按钮事件(单击任何按钮时发生)和单击标题栏上的“X”按钮事件。

默认情况下不启用元素事件。仅当创建元素时将“enable_events”参数设置为 True 时,才能检测到特定于元素的事件。

窗口关闭事件

当用户按下“X”按钮或执行 Window 类的close()方法时,使 PySimpleGUI 窗口持久化的无限事件循环将终止。终止循环的标准方法如下 -

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

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

如果此参数设置为 True,则 Widow 类还会发出“enable_close_attempted_event”。当在循环内检测到它时,调用 yes-no 弹出窗口是一个很好的做法。

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 CLOSE ATTEMPTED-”值。

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

按钮事件

按钮单击事件默认启用。要禁用,请使用“Button.update(disabled=True)”。您还可以在 Button 的构造函数中设置“enable_events=True”,它将启用 Button Modified 事件。当某些内容“写入”按钮时会触发此事件。

当我们读取窗口的内容时(使用“window.read()”),按钮值将是其标题(如果未设置 key)或 key(如果已设置)。

在上面的示例中,由于未在“添加”和“子”按钮上设置 key 参数,因此在读取窗口时将返回它们的标题。

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

将关键参数添加到程序中的“添加”和“子”按钮。

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'}

其他元素的事件

当发生某种类型的用户交互时,许多元素都会发出事件。例如,当移动滑块、选择列表中的项目或单击单选按钮时。

与按钮或窗口不同,默认情况下不启用这些事件。要启用元素的事件,请设置参数“enable_events=True”。

下表显示了元素以及它们生成的事件。

姓名 活动
输入文本 按下任意键
组合 已选择项目
列表框 选择已更改
收音机 选择已更改
复选框 选择已更改
旋转器 已选择新项目
多线 按下任意键
文本 点击
状态栏 点击
图形 点击
图形 拖拽
图形 拖动结束(鼠标向上)
选项卡组 单击了选项卡
滑块 滑块已移动
桌子 已选择行
选定的节点
按钮菜单 已选择菜单项
右键菜单 已选择菜单项