| оказался проще, чем мы думали:
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) и радуемся жизни. Интересно, можно ли ещё проще. | comments: 5 комментариев or Оставить комментарий  |
| Вчера мы с hakubo обсуждали Хаскель. Ну, обсуждали - это сильно сказано, обычно он присылает мне интересные ссылки на про языки программирования или аугментированную реальность, а я что-нибудь не слишком осмысленное пишу в эвей обратно, т.к. наши часы присутствия в онлайне сильно не совпадают.
Вообще я иногда до обидного медленно соображаю. Я бы и рад взяться за изучение чего-нибудь действительно нового и интересного (каждый, кто сидит в питоне дольше двух дней, уже заметил, что, собственно говоря, его целью не является быть интересным — он успехом занял место прагматичного и предельно простого в использовании повседневного инструмента для того, чтобы заставить компьютер делать нужное тебе, а не наоборот - и при этом не дискриминируя людей по платформе, господа юниксшеллофаги), но само осознание того, что на усвоение простейших концепций я потрачу минимум полгода, совершенно не взбадривает.
Но обратно к Хаскелю. Мне все больше начинает казаться, что функциональные языки скрывают кучу стройных, красивых и простых концепций за отвратительнейшим синтаксисом, как будто нарочно пытаясь нас запутать.
Ради интереса полез посмотреть ,как у хаскеля с гуями (т.е. может ли он использоваться для чего-то кроме консольных программ или библиотек). И меня сразу же потрясла одна вещь - wxHaskell уже реализует почти буквально вон тот декларативный гуевый велосипед, что я придумал на досуге. Да простят мне бесстыдный и бесконечный самопиар, я так редко придумываю достойные идеи, что искренне радуюсь, когда их, оказывается, уже сделали.
hello
= do f <- frame [text := "Hello!"]
quit <- button f [text := "Quit", on command := close f]
set f [layout := widget quit]
Вот это я называю «выразительность». Что (не)удивительно, этот код полностью понятен даже без какого бы то ни было знания Хаскеля, функциональных языков или принципов работы гуя на событийной основе.
Я по-прежнему боюсь тыкать палочкой Хаскель. Не могу представить, как лично мне его применить на практике, и хотя в теории это лечится чтением ртфм, на практике фм по нему часто запутан ещё больше, чем сам язык. Из других языков я, возможно, соберусь когда-нибудь потыкать палочкой Руби и Скалу. В Руби привлекает, по-видимому, большая гибкость и расширямость языка, полезная при создании кавайных, претенциозных и совершенно бесполезных маленьких DSL на месте. Чем хороша Скала, всем известно, хотя явовское наследие настораживает. | comments: 22 комментария or Оставить комментарий  |
| Пардон, интроспекция. На этом мы заканчиваем любимое нытьё о том, что нам якобы не дают нормально поковырять в живых объектах.
from wx.lib.mixins.inspection import InspectableApp app = InspectableApp(False) frame = TestFrame() frame.Show(True)
import wx.py shell = wx.py.shell.ShellFrame(frame, locals={'wx':wx, 'frame':frame}) shell.Show() app.MainLoop()
Ха! Кому после этого нужны дебаггеры? Вместе с нашим окном запускается PyCrust. Разобраться бы, как заставить wx выводить ошибки в стандартный поток вместо кретинического гуевого окошка, вызывающего exit() и исчезающего раньше, чем успеваешь прочитать трейсбэк. | comments: Оставить комментарий  |
| Наконец-то, наконец-то! Настоящий код инсайт: автодополнение находит импорты, анализирует их и выдает адекватную структуру классов. Из плюшек: нормальный дисплей-контрол, отображает шрифт очень качественно (аналогичный Комоду). Из встроенных цветовых схем дефолтная по традиции оказалась унылой «Серобуромалиновой», но Guepardo и Dessert терпимы. Дикое количество лексеров, и, соотв. синтаксической подсветки, и возможность её нормально настроить. Подсветка и автодополнение в шелле. Очень отзывчивый и почти неуродливый интерфейс. Если убрать тулбар, то можно даже забыть, что оно GTK. Ололо, я дал маху. Это ж официальный редактор платформы wxWidgets, входящий в дистрибутив :) Но зачем они сделали такой уродливый тулбар?.. Табы закрываются по средней кнопке мыши (приятно видеть, что эта парадигма стала повсеместно распространенной ^^) Из минусов: Суровые глюки, влоть до внезапно стирания файла при обновлении. Без бэкапа или контроля версий работать нельзя. :( UPD: Молодец разраб, глюк оперативно выпилил. Там просто опечатка была =)
Пытался перенести настройки цветовой схемы из комода в едитру (да, все уже поняли, что я больной на голову, но все же) - и не понял, как они в Комоде в конфиг-файле цвет записывают. Скажем, R:153 G:0 B:0 будет записано как «153», но вот R:0 G:153 B:0 — это уже внезапно «39168». Что это? | comments: 3 комментария or Оставить комментарий  |
| |