我正在尝试使用嵌套事件。 当我浏览文件时,仅从完整路径中删除文件名会触发一个事件,该事件使文件名传输到具有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()
但是没有用。
有什么想法吗?
谢谢
答案 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'
。