0

考虑以下问题:我有一个 gtk / tk 应用程序,它在列表(商店)中显示来自网站的内容。我想按顺序做以下事情:

  • 显示窗口并开始下载
  • 显示进度条
  • 下载完成后将数据添加到列表中(存储)

这是条件:用户必须能够在下载时与应用程序交互。这意味着程序在整个下载过程中都在窗口的主循环中。

什么不起作用:

  • urllib.urlopen() 等待整个下载完成
  • Popen() 不允许在两个线程之间进行我想要的通信

如何通知程序下载完成是最大的问题

由于 Tk/Gtk 无论如何我都是事件驱动的,我不妨使用信号

我首选的解决方法是注册一个附加信号“dl_done”,并在下载完成后将该信号发送到 gtk。这甚至可能吗?任何建议都非常感谢!

4

1 回答 1

1

一个简单的解决方案是:

  • 在 Gtk 线程和下载线程之间共享一个 Queue 对象
  • 下载完成后,您将来自下载线程的数据放入队列中(例如,带有下载 URL 和下载内容的元组)
  • 在 Gtk 线程中,由于 Queue 对象的“get_nowait”方法,您设置了一个 glib 计时器定期检查队列中是否有新内容(例如,每 100 毫秒)。

如果需要,您可以有多个下载线程。

于 2013-09-29T14:36:46.007 回答