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

Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.

其他元素的事件

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

与 Button 或 Window 不同,这些事件默认不启用。要为元素启用事件,请设置参数“enable_events=True”。

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

名称 事件
InputText 按下任何键
Combo 项目被选中
Listbox 选择更改
Radio 选择更改
Checkbox 选择更改
Spinner 新项目被选中
Multiline 按下任何键
Text 点击
状态栏 点击
图形 点击
图形 拖动
图形 拖动结束(鼠标抬起)
TabGroup 标签被点击
Slider 滑块移动
Table 行被选中
Tree 节点被选中
ButtonMenu 菜单项被选中
右键菜单 菜单项被选中
广告