问题描述
我有一个 FileChooserDialog,当我调用 file_picker.destroy 时,它不会退出,直到整个函数退出。如何让它立即销毁并仍然执行函数中的其余代码?它只是挂起,直到 youtube-dl 完成。我的代码:
builder = Gtk.Builder()
builder.add_from_file("youtube-dl-gtk.glade")
window = builder.get_object("window")
window.show_all()
file_picker = builder.get_object("file_picker")
builder.get_objects()
folder = None
def youtube_dl_hook(d):
if d['status'] == 'finished':
print(d['filename'])
class youtube_dl_logger(object):
def debug(self,msg):
pass
def warning(self,msg):
pass
def error(self,msg):
print(msg)
def close_folder(button):
file_picker.hide()
def download_video():
url = builder.get_object("url")
url = url.get_text()
os.chdir(folder)
ydl_opts = {
'logger': youtube_dl_logger(),'progress_hooks': [youtube_dl_hook],}
with youtube_dl.YoutubedL(ydl_opts) as ydl:
ydl.download([url])
def choose_folder(button):
file_picker.show_all()
def open_folder(button):
global folder
folder = file_picker.get_current_folder()
file_picker.destroy()
download_video()
handlers = {
"close_clicked_cb": Gtk.main_quit,"on_download_clicked": choose_folder,"on_open_folder_clicked": open_folder,"on_close_folder_clicked": close_folder
}
builder.connect_signals(handlers)
Gtk.main()
解决方法
在您将控制权返回到 GTK 的主循环之前,不会更新显示。最好的解决方案是异步下载,以免阻塞主循环。