Анимационный счетчик с потоком pygtk

я пытаюсь анимировать счетчик, в то время как программа работает, но я не могу. Я пытался использовать потоки, но я не могу получить то, что я хочу..., можно здесь искать прогресс, я сделал http://www.reddit.com/r/ubuntuappshowdown/comments/vvyav/problem_with_spinner/

я заставляю счетчик анимировать, но программа прекращает работать...

2
задан 4 July 2012 в 18:23

2 ответа

Я видел твой вопрос вчера и на Reddit.

Когда я попытался использовать нити в python и gtk, мне потребовалась одна ночь, чтобы понять это.

В конце это было так же просто, как

GObject.threads_init()
Gdk.threads_init()

в начале, а затем порождать потоки, как вы обычно делаете в python с чем-то вроде

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

У меня есть не знаю, поможет ли это вам. Но я очень на это надеюсь. Я также посмотрю на ваш код и позже смогу отредактировать мой ответ:)

0
ответ дан 4 July 2012 в 18:23

При использовании потоков и PyGTK помните о двух следующих советах:

  • Обязательно вызовите GObject.threads_init() как можно скорее в своей программе, чтобы включить многопоточность в приложении PyGTK. 116]

  • Если вы выполняете какие-либо задачи с графическим интерфейсом в своем потоке, оберните его внутри 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()
0
ответ дан 4 July 2012 в 18:23

Другие вопросы по тегам:

Похожие вопросы: