【发布时间】:2023-01-20 17:45:05
【问题描述】:
我在 PySimpleGUI 中有一个窗口,其中包含许多布局和子窗口,全部由 单击按钮,每个按钮都有一个定义的键来识别用户的选择。
Windows“事件”参数通过以下方式获得用户选择:window.read()。
出于某种原因,当程序启动时,这些键(在 GUI 启动之前已明确定义) 被添加到其原始值的数字更改。
为什么会这样?
谢谢!
【问题讨论】:
标签: python pysimplegui
我在 PySimpleGUI 中有一个窗口,其中包含许多布局和子窗口,全部由 单击按钮,每个按钮都有一个定义的键来识别用户的选择。
Windows“事件”参数通过以下方式获得用户选择:window.read()。
出于某种原因,当程序启动时,这些键(在 GUI 启动之前已明确定义) 被添加到其原始值的数字更改。
为什么会这样?
谢谢!
【问题讨论】:
标签: python pysimplegui
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 和逻辑的设计,以避免意外行为。
【讨论】: