Команданте ибн Кандела ([info]dervish_candela) wrote,
@ 2009-10-02 12:30:00
Previous Entry  Add to memories!  Tell a Friend  Next Entry
Entry tags:gui, wx, быдлокодинг, питонство

асинхронный гуй
оказался проще, чем мы думали:

import threading
import wx.lib.newevent
MakeEvent01, wx.EVENT01 = wx.lib.newevent.NewEvent()

class widget1(wx.SomeWidget):
def async_report(self, s):
    event = MakeEvent01()
    event.text = s
    wx.PostEvent(self, event)

def __init__(self, parent, **kwargs):
   wx.SomeWidget.__init__(self, parent, wx.ID_ANY, **kwargs)

def AssignJob(self,do_stuff):
   do_stuff_frozen = functools.partial(do_stuff, async_report)
   self.t = threading.Thread(target=do_stuff_frozen)
   self.Bind(wx.EVENT01, self.Event01Handler)
   self.t.start()

def Event01Handler(self, evt)
   self.Display(evt.text)

Этому добру кормим любую функцию вида DoSomeLongAndHeavyStuff(log) и радуемся жизни.
Интересно, можно ли ещё проще.



(5 comments) - (Post a new comment)


[info]gremlinable
2009-10-04 11:34 am UTC (link)
А в чём фишка то? Что этот код делает? В Питоне не разбираюсь, так что просьба на пальцах =)

(Reply to this) (Thread)


[info]dervish_candela
2009-10-04 03:54 pm UTC (link)
делаем виджет, по учающий функцию и запускающий ее в новом треде. получает от нее сообщения и выводит их (методами родителя, естесьвенно) без нашего участия.

в принципе в запуске функции в треде ничего сложного нет, от меня потребовалось только разобраться как зарегистрировать и использовать к
стомное событие

(Reply to this) (Parent)(Thread)


[info]gremlinable
2009-10-04 04:48 pm UTC (link)
В общем, смысл сводится к построению событийного взаимодействия? нечто подобное на крестах я делал, только не для гуя, а для внутреннего алгоритма проги =)
Кстати, как я понимаю, треды используются системные. А почему не вх-совые?

(Reply to this) (Parent)(Thread)


[info]dervish_candela
2009-10-04 05:38 pm UTC (link)
будешь смеяться, я думал что это wx треды. я пример-то этот, с которого начинал (чересчур раздутый) выкопал откуда-то из демки тоже. Потом оказалось, что threading.Thread - тоже питоновский, но уже высокоуровневый интерфейс к просто thread. Я не знаю, что лучше - вх'овые треды или питонские (и чем именно). Кстати, вот эта штука - wxThreadHelper - выглядит очень интересно.

Лично для меня основным вызовом было изящно подменить в функции (в рабочем алгоритме, который вызывается, не изменяя его) параметр типа потока на функцию, отправляющую сообщения. Что и удалось сделать ради великой справедливости использовав функциональную приблуду functools.partial. Это заодно позволило отказаться полностью от субклассинга Thread и запихнуть всё в один класс.

(Reply to this) (Parent)


[info]dervish_candela
2009-10-04 03:57 pm UTC (link)
ну и хотелось принципиально имеющиеся функции, пишущие в консоль, использовать без изменения. вроде получилось.

(Reply to this) (Parent)


(5 comments) - (Post a new comment)

Create an Account
Forgot your login or password?
Login w/ OpenID
English • Español • Deutsch • Русский…