Использовать gtk.Spinner в потоке Python? - PullRequest
0 голосов
/ 23 марта 2012

Я новичок в Python. Я пытаюсь сделать простое приложение с графическим интерфейсом: главное окно с gtk.Spinner и gtk.Button. Когда я нажимаю кнопку, спиннер запускается и останавливается через 5 секунд. Вот мой код, но он не работает:

#!/usr/bin/env python
import thread
import gtk
import time

class Spinner:
    def __init__(self):
        window = gtk.Window()
        window.set_default_size(200, 200)
        vbox = gtk.VBox(False, 5)
        hbox = gtk.HBox(True, 5)

        self.spinner = gtk.Spinner()
        button_start = gtk.Button("Start")


        window.connect("destroy", lambda w: gtk.main_quit())
        button_start.connect("clicked", self.start_animation)

        window.add(vbox)
        vbox.pack_start(self.spinner, True, True, 0)
        vbox.pack_end(hbox, False, False, 0)
        hbox.pack_start(button_start)

        window.show_all()

    def start_animation(self, widget):
        self.lock = thread.allocate_lock()
        thread.start_new_thread(self.spin,(self.lock,))
        while (not self.lock.locked()):
            self.spinner.stop()
        while self.lock.locked():
            self.spinner.start()

        self.spinner.show()

    def spin(self,lock):
        self.lock.acquire()
        time.sleep(10)
        self.lock.release()     
Spinner()
gtk.main()

Я прочитал пример с темой и попробую его использовать. но это не работа. Пожалуйста, помогите мне. Ткс много.

1 Ответ

0 голосов
/ 23 марта 2012
import sys
import pygtk
pygtk.require('2.0')
import gtk
import glib


def buildGui(label, startAnimation):
    window = gtk.Window()
    window.set_default_size(200, 200)
    vbox = gtk.VBox(False, 5)
    hbox = gtk.HBox(True, 5)
    spinner = gtk.Spinner()
    button = gtk.Button('Start')
    window.connect('destroy', gtk.main_quit)
    button.connect('clicked', startAnimation, spinner)
    window.add(vbox)
    vbox.pack_start(gtk.Label(label), False, False, 0)
    vbox.pack_start(spinner, True, True, 0)
    vbox.pack_end(hbox, False, False, 0)
    hbox.pack_start(button)
    window.show_all()
    gtk.main()

def stopAnimation(button, spinner):
    spinner.stop()
    button.set_sensitive(True)

def startAnimation(button, spinner):
    button.set_sensitive(False)
    glib.timeout_add_seconds(5, stopAnimation, button, spinner)
    spinner.start()

if len(sys.argv) == 2:
    if sys.argv[1] == '--timeout':
        def stop(button, spinner):
            stopAnimation(button, spinner)
            return False
        def start(button, spinner):
            startAnimation(button, spinner)
            glib.timeout_add_seconds(5, stop, button, spinner)
        label = 'using glib timeout'
    elif sys.argv[1] == '--timer':
        import threading

        def stop(button, spinner):
            stopAnimation(button, spinner)

        def start(button, spinner):
            startAnimation(button, spinner)
            threading.Timer(5, stop, (button, spinner))
        label = 'using timer'
else:
    import threading
    import time

    def stop(button, spinner):
        time.sleep(5)
        stopAnimation(button, spinner)
        spinner.stop()

    def start(button, spinner):
        startAnimation(button, spinner)
        threading.Thread(target=stop, args=(button, spinner))
    label = 'using threading'

buildGui(label, start)
...