summaryrefslogtreecommitdiff
path: root/examples/threading/gtk_threading.py
blob: 01416ddb70e225e71df992d6a50747cd06a95b94 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#!/usr/bin/env python


import time
import threading

import pygtk
pygtk.require('2.0')
import gtk
import gobject


def identify(message):
    t = threading.current_thread()
    print t.name, message


class WorkerThread(threading.Thread):
    def __init__(self, window):
        identify('Initializing new thread')

        threading.Thread.__init__(self)
        self.window = window

    def run(self):
        identify('Doing work in new thread')

        for i in range(10):
            # Let's do some hard work here
            time.sleep(0.5)

            # let the window know we did something
            gobject.idle_add(self.window.worker_update, 'Doing hard work: %s' % str(i+1))

            # and update the progressbar
            fraction = (i + 1) / float(10)
            gobject.idle_add(self.window.progress.set_fraction, fraction)

        # We're done
        gobject.idle_add(self.window.worker_join)


class TestWindow(gtk.Window):
    __gtype_name__ = 'TestWindow'

    def __init__(self):
        gtk.Window.__init__(self)
        self.set_border_width(4)
        self.connect('delete-event', self.on_delete_event)
        self.working = False

        self.vbox = gtk.VBox(spacing=4)
        self.add(self.vbox)

        self.progress = gtk.ProgressBar()
        self.vbox.pack_start(self.progress)

        self.label = gtk.Label()
        self.vbox.pack_start(self.label)

        self.button = gtk.Button('start thread')
        self.button.connect('clicked', self.button_clicked)
        self.vbox.pack_start(self.button)

    def on_delete_event(self, widget, event):
        if self.working:
            # do not close this window now, we'e working!
            return True
        else:
            return False

    def button_clicked(self, button):
        self.button.set_sensitive(False)
        self.worker_start()

    def worker_start(self):
        self.working = True
        self.worker = WorkerThread(self)
        self.worker.start()

    def worker_update(self, value):
        t = threading.current_thread()
        print t.name, 'Updating label'
        self.label.set_text(value)

    def worker_join(self):
        self.worker.join()
        self.button.set_sensitive(True)
        self.label.set_text('Done!')
        self.working = False


if __name__ == '__main__':
    gobject.threads_init()

    testwindow = TestWindow()
    testwindow.connect('delete-event', gtk.main_quit)
    testwindow.show_all()

    gtk.main()