我试图在程序运行时为旋转器设置动画,但我做不到。我尝试使用线程,但我无法得到我想要的结果...你可以在这里查看我取得的进展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()
我不知道这是否对你有帮助。但我希望如此。我也会看看你的代码,然后可能会修改我的答案:)