使用线程 pygtk 制作动画旋转器

使用线程 pygtk 制作动画旋转器

我试图在程序运行时为旋转器设置动画,但我做不到。我尝试使用线程,但我无法得到我想要的结果...你可以在这里查看我取得的进展http://www.reddit.com/r/ubuntuappshowdown/comments/vvyav/problem_with_spinner/

我让旋转器动起来但是程序停止运行......

答案1

使用线程和 PyGTK 时请记住以下 2 个提示:

  • 确保GObject.threads_init()尽快在程序中调用以在 PyGTK 应用程序中启用线程。

  • 如果你在线程中执行任何 GUI 任务,请将其包装在里面GObject.idle_add(callable)总是

这是一个完整的工作示例,请根据需要调整您的代码:

import time
import threading

from gi.repository import Gtk, GObject
GObject.threads_init() # Don' forget!


class WorkerThread(threading.Thread):
    def __init__(self, callback):
        threading.Thread.__init__(self)
        self.callback = callback

    def run(self):
        # Simulate a long process, do your actual work here
        time.sleep(4)

        # The callback runs a GUI task, so wrap it!
        GObject.idle_add(self.callback)


class MyWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.connect('delete-event', Gtk.main_quit)
        self.resize(400, 400)

        vbox = Gtk.VBox()

        button = Gtk.Button("Let's spin!")
        button.connect('clicked', self.on_button_clicked)
        vbox.pack_start(button, False, False, 0)

        self.spinner = Gtk.Spinner()
        vbox.pack_start(self.spinner, True, True, 0)
        self.add(vbox)
        self.show_all()

    def on_button_clicked(self, widget):
        self.spinner.start()
        thread = WorkerThread(self.work_finished_cb)
        thread.start()

    def work_finished_cb(self):
        self.spinner.stop()

if __name__ == "__main__":
    app = MyWindow()
    Gtk.main()

答案2

我昨天也在 reddit 上看到了你的问题。

当我尝试在 python 和 gtk 中使用线程时,我花了一个晚上的时间才弄明白。

最后就很简单了

GObject.threads_init()
Gdk.threads_init()

在开始时,然后像在 Python 中通常使用的那样生成线程,例如

watch_thread = Thread(target=self.function)
watch_thread.daemon = True
watch_thread.start()

我不知道这是否对你有帮助。但我希望如此。我也会看看你的代码,然后可能会修改我的答案:)

相关内容