Как использовать вложенные события в PySimpleGUI

Я пытаюсь использовать вложенные события. Когда я просматриваю файл, одно имя файла, удаляемое из полного пути, вызывает событие, которое переводит имя файла в текстовое поле, для которого enable_events установлено значение true, что вызывает другое событие для вызова функции и получения подробностей в формате pdf.,

Если я включу две закомментированные строки, вы увидите, что функция работает и передает возвращаемое значение, но я пытаюсь разделить эти два события, так как функция для получения сведений о PDF занимает некоторое время.

Итак, порядок:

__pdfpath__ получает полный путь к определенному просматриваемому файлу, который вызывает событие, которое передает имя файла в __bookfilename__, которое должно вызвать другое событие, которое вызовет функцию, которая отправит свой ответ __pdfdetails__

импортировать PySimpleGUI как sg
импорт ОС


def get_pdf_details(pdfname):

    вернуть pdfname + 'было обработано'

макет = [

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


]

window = sg.Window('', макет)

пока верно:
    событие, значение = window.Read()

    если событие == '_pdfpath_':
        filename = os.path.basename(значение ['_pdfpath_'])
        window.Element('_bookfilename_').Update(имя файла)

        #response = get_pdf_details(имя файла)
        # Window.Element('_pdfdetails_').Update(ответ)
    если событие == '_bookfilename_':
        response = get_pdfdetails(значение ['_bookfilename_'])
        window.Element('_pdfdetails_').Update(ответ)

Итак, вопрос в том, как я могу вызвать второе событие?

Я попытался создать второе окно. Read (), чтобы создать второй цикл следующим образом:

event2, value2 = window.Read()

но не сработало.

Есть идеи?

Спасибо

3 ответа

Решение

Путь через это не события, путешествующие вокруг PySimpleGUI. Что вам нужно сделать, это разбить вашу длительную функцию в поток.

Затем установите ваш Read функция со значением тайм-аута. В вашем цикле проверьте, когда заканчивается поток.

Попробуй это:

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)

У PSG есть один волшебный элемент, который может запускать событие, когда вы хотите, это в основном кнопка, ее можно скрыть, установив visible=False. Просто вызовите window['ButtonKey']. Click() там, где вы хотите запустить событие 'ButtonKey'. Альтернативный хитрый способ !!!

Другие вопросы по тегам