FileChooserDialog 直到函数退出才关闭 - Python GTK

问题描述

我有一个 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 的主循环之前,不会更新显示。最好的解决方案是异步下载,以免阻塞主循环。