【问题标题】:Handling GTK Objects on Threads in Python在 Python 中处理线程上的 GTK 对象
【发布时间】:2015-10-29 21:47:50
【问题描述】:

我正在用 Python 创建一个应用程序,它使用 GTK 来构建 UI,我对在线程上处理 GTK 对象(例如 GtkProgressBar 对象)有点困惑。

这里是上下文:

我尝试在主线程上进行下载,并添加GObject.timeout_add 以使条形脉冲直到下载结束。但是在第一个脉冲之后,UI 冻结了。

直到那里OK,线程冻结直到下载完成,所以任何组件都将被更新。解决方案:创建一个新线程。

我创建了这个新线程来进行下载和其他事情。在这个线程上,我收到进度条来进行更新。但是,当下载运行时,我添加了GObject.timeout_add 来脉冲栏,UI 再次冻结。新解决方案:创建第三个线程。

所以我的线程看起来像这样:

Main-Thread
    '---- Thread 1
             '------Thread 2

所以,在Thread 1 上,我制作了另一件事并更新了 UI,而在Thread 2 上我进行了下载并添加了GObject.timeout_add,在那里我可以更新进度条。在Thread 1 我加入Thread 2

我使用GObject.idle_add 函数处理 Gtk 对象。

但我很困惑为什么进度条的下载和更新在Thread 2 上运行良好而不在Thread 1 上运行良好

有人可以向我解释为什么会发生这种情况,或者如果我错过了有关处理 GTK 对象的一些内容。

谢谢

【问题讨论】:

    标签: python multithreading pygtk pygobject


    【解决方案1】:

    如果您阻止 Gtk 主循环,窗口和小部件将变得无响应。这就是为什么您不能在主线程中进行下载的原因。从下载线程更新 Gtk.ProgressBar 可能会起作用,具体取决于您的实现方式。

    这是一种下载内容并拥有工作进度条的方法:

    from gi.repository import Gtk, GLib
    import threading
    import urllib.request
    
    class Window(Gtk.Window):
        def __init__(self):
            super().__init__()
            self.connect('delete-event', Gtk.main_quit)
            self.progress = Gtk.ProgressBar()
            self.add(self.progress)
            self.show_all()
    
            # Start download
            self.thread = threading.Thread(target=self.download)
            self.thread.start()
            GLib.timeout_add_seconds(1, self.download_pulse)
    
        def download(self):
            urllib.request.urlretrieve('<link>')
    
        def download_pulse(self):
            if self.thread.is_alive():
                self.progress.pulse()
                return True
            return False
    
    win = Window()
    Gtk.main()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多