Остановить блокировку графического интерфейса pygtk во время длительного процесса

У меня есть процесс, который займет некоторое время (возможно, минуту или две), чтобы завершить. Когда я вызываю это из моего pygtk GUI, окно блокируется (темнеет и предотвращает действия пользователя) примерно через 10 секунд.

Я бы хотел, чтобы это не случилось, но я не уверен, как это сделать. Я думал, что многопоточность будет ответом, но, похоже, не работает. Я пробовал два разных метода, которые я нашел в Интернете. Сначала я модифицировалэтот FAQ взять на себя долгосрочную функцию. Во-вторых, я пытался использовать потоки.этот ответ, но это также запирает.

Мои два образца ниже. Я новичок в многопоточности, так что, возможно, это не то решение, которое я ищу. Я просто пытаюсь не допустить блокировки графического интерфейса, чтобы я мог обновить с помощью индикатора выполнения и позволить пользователю использовать кнопку отмены.

#Sample 1
import threading
import time
import gobject
import gtk

gobject.threads_init()

class MyThread(threading.Thread):
    def __init__(self, label, button):
        super(MyThread, self).__init__()
        self.label = label
        self.button = button
        self.counter = 0
        button.connect("clicked", self.on_button_click)
        self.quit = False

    def update_label(self, counter):
        self.label.set_text("Counter: %i" % counter)
        time.sleep(20)
        return False

    def on_button_click(self, widget):
        self.counter += 1
        gobject.idle_add(self.update_label, self.counter)

window = gtk.Window()
label = gtk.Label()
box = gtk.VBox()
button = gtk.Button("Test")
box.pack_start(label)
box.pack_start(button)
window.add(box)
window.show_all()
window.connect("destroy", lambda _: gtk.main_quit())
thread = MyThread(label, button)
thread.start()

gtk.main()
thread.quit = True

#####################################
#Sample 2

from threading import Thread
import time
import gobject
import gtk

class Test():
    def __init__(self):
        self.counter = 0
        self.label = gtk.Label()
        button = gtk.Button("Test")

        window = gtk.Window()
        box = gtk.VBox()
        box.pack_start(self.label)
        box.pack_start(button)
        window.add(box)

        window.connect("destroy", lambda _: gtk.main_quit())
        button.connect("clicked", self.on_button_click)
        window.show_all()

    def update_label(self, counter):
        self.label.set_text("Counter: %i" % counter)
        time.sleep(20)
        return False

    def on_button_click(self, widget):
        self.counter += 1
        thread = Thread(target=self.update_label, args=(self.counter,))
        thread.start()
        while thread.is_alive():
            pass
        thread.stop()

test = Test()
gtk.main()

Ответы на вопрос(2)

Ваш ответ на вопрос