1

我正在尝试使用嵌套事件。当我浏览文件时,仅从完整路径中删除文件名就会触发一个事件,该事件使文件名传输到 enable_events 设置为 true 的文本框,这将触发另一个事件来调用函数并获取 pdf 详细信息.

如果我启用两个注释行,您可以看到该函数工作并传输返回值,但我试图将这两个事件分开,因为获取 PDF 详细信息的函数需要一段时间。

所以顺序是:

__pdfpath__获取某个浏览文件的完整路径,该文件触发将文件名传输到__bookfilename__的事件,该事件应触发另一个事件,该事件将调用将其响应发送到__pdfdetails__的函数

将 PySimpleGUI 导入为 sg
导入操作系统


def get_pdf_details(pdfname):

    return pdfname + '已处理'

布局 = [

[sg.InputText('',key='_pdfpath_',enable_events=True),sg.FileBrowse(key='_filepath_')],
[sg.Text('',key='_bookfilename_',enable_events=True,size=(40, 1))],
[sg.Text('',key='_pdfdetails_', size=(40, 1) )],


]

window = sg.Window('', 布局)

而真:
    事件,值 = window.Read()

    如果事件 == '_pdfpath_':
        文件名 = os.path.basename(值['_pdfpath_'])
        window.Element('_bookfilename_').Update(文件名)

        #response = get_pdf_details(文件名)
        #window.Element('_pdfdetails_').Update(响应)
    如果事件 == '_bookfilename_':
        response = get_pdfdetails(value['_bookfilename_'])
        window.Element('_pdfdetails_').Update(响应)

那么问题来了,如何触发第二个事件呢?

我尝试创建第二个window.Read()来创建第二个循环,如下所示:

event2, value2 = window.Read()

但没有用。

有任何想法吗?

谢谢

4

3 回答 3

1

解决这个问题的方法不是围绕 PySimpleGUI 传播的事件。您需要做的是将长时间运行的函数分解为线程。

编辑 - 自 2019 年初的原始答案以来,PySimpleGUI 中继续添加了很多内容。

因为函数耗时太长是编写 GUI 时最常遇到的问题之一,所以添加了一种方法,以便那些还没有准备好编写自己的线程代码的初学者不会受到阻碍。

Window.perform_long_operation函数或 lambda 表达式作为参数和函数返回时将返回的键。

window.perform_long_operation(my_long_operation, '-OPERATION DONE-')

您将获得多线程的好处,而无需自己完成所有工作。这是一种“垫脚石”的方法。一些用户在编写他们的第一个 GUI 时才使用 Python 2 或 3 周,而且还没有为线程模块做好准备。

Cookbook 有一个关于这个主题的部分,eCookbook 有许多可以立即运行的示例。http://Cookbook.PySimpleGUI.orghttp://Cookbook.PySimpleGUI.org

演示程序总是一个很好的地方 - http://Demos.PySimpleGUI.org。截至 2021 年,那里至少有 13 个示例。

在此处输入图像描述

于 2019-05-14T14:44:08.357 回答
0

PSG 有一个魔法元素,可以随时触发事件,它基本上是 Button,可以通过设置 visible=False 来隐藏它。只需调用window['ButtonKey'].click()您要触发'ButtonKey'事件的位置即可。

于 2021-06-28T14:19:06.823 回答
0

尝试这个:

while True:
    event, value = window.Read()
    process_event(event, value)
def process_event(event, value):
    if event == '_pdfpath_':
        filename = os.path.basename(value['_pdfpath_'])
        window.Element('_bookfilename_').Update(filename)
        value.update(_bookfilename_=filename)
        process_event('_bookfilename_', value)
    if event == '_bookfilename_':
        response = get_pdfdetails(value['_bookfilename_'])
        window.Element('_pdfdetails_').Update(response)
于 2020-07-08T16:45:03.243 回答