Здрасте.
Кто с PyGTK знаком хорошо, может знаете как там с потоками правильно обращаться?
Вот пример (взят helloworld.py из доки к PyGTK и переделан под нужды вопроса):
import pygtk
pygtk.require('2.0')
import gtk
from threading import Thread
from time import sleep
class HelloWorld:
def hello1(self, widget, data=None):
self.drugoypotok=Thread(target=self.hello2, name=“t1”)
self.drugoypotok.start()
def hello2(self):
print “Hello World”
sleep(0.1)
print “Hello Hello World”
def delete_event(self, widget, event, data=None):
print “delete event occurred”
return False
def destroy(self, widget, data=None):
print “destroy signal occurred”
gtk.main_quit()
def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.connect(“delete_event”, self.delete_event)
self.window.connect(“destroy”, self.destroy)
self.window.set_border_width(10)
self.button = gtk.Button(“Hello World”)
self.button.connect(“clicked”, self.hello1, None)
self.window.add(self.button)
self.button.show()
self.window.show()
def main(self):
gtk.main()
if __name__ == “__main__”:
hello = HelloWorld()
hello.main()
Если кнопкой вызывать сразу hello2, то выводятся обе строки, а если так как здесь, в отдельном потоке, то на sleep(0.1) застревает напрочь. Но при закрытии окна вторую строчку всё-таки выводит.
Если бы это проявлялось только в sleep, я бы длинными циклами проц помучал бы и ладно, но такой же эффект проявляется при ожидании данных из сокета, а именно для этого всё и затевалось.
Первоначально прогу сделал под wxPython, всё прекрасно пошло, а сейчас пытаюсь для таблетки Nokia N800 переписать, а там GTK только.