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”。

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

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