Как использовать вложенные события в 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'. Альтернативный хитрый способ !!!