Найти - Пользователи
Полная версия: PyGTK, треды и time.sleep
Начало » GUI » PyGTK, треды и time.sleep
1
Striver
Здрасте.

Кто с 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 только.
Striver
Ну, раз сие никому не ведомо,… придётся убирать потоки из программы, делать её подтормаживающей и выводящей страшную надпись “Ждите ответа…”
pythonwin
а пробовал gtk.gdk.threads_init() и gobject.timeout_add(step_time, func)
Striver
О, pythonwin, спасибо, то что надо!
Теперь, вроде, разобрался.

Вот так надо переделать внизу программульку примера, чтобы всё заработало:

if __name__ == “__main__”:
gtk.gdk.threads_init()
hello = HelloWorld()
gtk.threads_enter()
hello.main()
gtk.threads_leave()

gobject.timeout_add вроде, имеет другое назначение - запустить функцию через step_time миллисекунд. Но если в это время программа работает, а не тупо ждёт нажатия кнопок, то эта функция у меня не срабатывала. Хотя, может, с gdk.threads_init это и заработает…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB