如何在PySimpleGUI中使用嵌套事件

时间:2019-05-14 10:07:23

标签: python pysimplegui

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

如果启用两条注释行,则可以看到该函数有效并传输了返回值,但是由于函数要获取PDF的详细信息需要一段时间,因此我试图将这两个事件分开。

所以顺序是:

__ pdfpath __ 获取某个浏览文件的完整路径,该文件触发一个事件,该事件将文件名传输到 __ bookfilename __ ,该事件应触发另一个事件,该事件将调用将发送的函数对 __ pdfdetails __

的回应
import PySimpleGUI as sg
import os


def get_pdf_details(pdfname):

    return pdfname + ' was processed'

layout = [

[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('', layout)

while True:
    event, value = window.Read()

    if event == '_pdfpath_':
        filename = os.path.basename(value['_pdfpath_'])
        window.Element('_bookfilename_').Update(filename)

        #response = get_pdf_details(filename)
        #window.Element('_pdfdetails_').Update(response)
    if event == '_bookfilename_':
        response = get_pdfdetails(value['_bookfilename_'])
        window.Element('_pdfdetails_').Update(response)

问题是,如何触发第二个事件?

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

event2, value2 = window.Read()

但是没有用。

有什么想法吗?

谢谢

3 个答案:

答案 0 :(得分:1)

通过这种方式的方式不是在PySimpleGUI周围传播事件。您需要做的是将长时间运行的功能分解为一个线程。

然后,将Read函数设置为一个超时值。在循环中,检查线程何时结束。

答案 1 :(得分: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)

答案 2 :(得分:0)

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