【问题标题】:events key is changing from what was defined事件键与定义的不同
【发布时间】:2023-01-20 17:45:05
【问题描述】:

我在 PySimpleGUI 中有一个窗口,其中包含许多布局和子窗口,全部由 单击按钮,每个按钮都有一个定义的键来识别用户的选择。

Windows“事件”参数通过以下方式获得用户选择:window.read()。

出于某种原因,当程序启动时,这些键(在 GUI 启动之前已明确定义) 被添加到其原始值的数字更改。

为什么会这样?

谢谢!

【问题讨论】:

    标签: python pysimplegui


    【解决方案1】:

    PySimpleGUI 程序中的键被更改的原因可能是由于 PySimpleGUI 的事件循环的工作方式。

    PySimpleGUI 使用队列来存储用户与 GUI 交互时生成的事件。当一个事件产生时(例如按钮点击),它被添加到队列中并且 window.read() 函数从队列中检索下一个事件并返回它。

    如果在调用 window.read() 之前生成了多个事件,它们将全部添加到队列中并按照它们生成的顺序返回。这意味着如果用户在 window.read() 被调用之前点击了多个按钮,这些按钮的键将按照按钮被点击的顺序返回,而不是按钮被定义的顺序。

    此问题的一种解决方案是使用 window.read(timeout=0) 函数而不是 window.read()。这将使 window.read() 函数立即返回,使您可以在事件生成后立即对其进行处理。

    另一种解决方案是在调用 window.read() 之前检查事件队列,如果有任何事件,您可以使用 window.read(timeout=0) 来检索它们。

    while True:
    event, values = window.read(timeout=0)
    if event in (None, 'Exit'):
        break
    # your code here
    

    您还可以在循环中使用 window.read(timeout=0) 在处理当前事件之前检查事件队列中是否有新事件,然后仅在处理当前事件时才继续下一个事件。

    重要的是要注意 window.read() 函数是一个阻塞函数,这意味着它会等待事件生成,然后再返回。如果您使用像 window.read(timeout=0) 这样的非阻塞函数,您应该小心 GUI 和逻辑的设计,以避免意外行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-09
      • 2014-02-27
      • 1970-01-01
      • 2018-04-03
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      相关资源
      最近更新 更多