понедельник, 26 января 2009 г.

На свои же грабли...

Недавно писал про with в Python'e и сам же наступил на связанные с ним грабли: некоторые исключения при таинственных обстоятельствах исчезали. Кроме with'а, подозреваемых не было, но следствие показало, что сам по себе оператор в этом не виноват. Причина была в менеджере контекста, функция __exit__ которого всегда возвращала True и тем самым подавлял все возможные исключения.

Read More...

четверг, 22 января 2009 г.

Пример оптимизации кода на Python

Интересный пример оптимизации кода на Python можно посмотреть здесь.

Read More...

четверг, 15 января 2009 г.

The History of Python

Гвидо ван Россум, тот который автор Питона, начал вести блог об истории Питона, который так и называется The History of Python.

Read More...

среда, 14 января 2009 г.

Трабла setHidden у QTreeWidgetItem

Суть проблемы

Есть дерево (QTreeWidget) элементов (QTreeWidgetItem). По событию некоторые элементы нужно скрыть, а скрытые отобразить, для чего используется функция setHidden у QTreeWidgetItem. После фильтрации это все сортируется:

def add_subitems(self, root_item):        
'''Добавить элементы к корневому элементу'''

def add(text, hide=False):
sub_item = QtGui.QTreeWidgetItem(root_item)
sub_item.setText(0, text)
sub_item.setHidden(hide)

map(lambda val: add(*val), ( ('one',),
('two', True),
('three',) ))

def update_subitems(self, root_item):
'''Обновить под-элементы - скрыть или отобразить'''

for index in range(root_item.childCount()):
item = self.root_item.child(index)
# для упрощения скрываются видимые элементы,
# а скрытые отображаются
item.setHidden(not item.isHidden())

self.treeWidget.sortItems(0, QtCore.Qt.AscendingOrder)

Если update_subitems вызывается когда окно скрыто (свернуто в трей), часть вызовов setHidden отрабатывается не правильно и при восстановлении окна из трея пользователь видит не то, что должен видеть. Если убрать сортировку или не скрывать окно - все работает как надо.

Решение

Единственное решение, которое я нашел - отлавливать момент, когда окно отображается (QShowEvent) и обновлять дерево еще раз:
def event(self, ev):
if ev.type()==QtCore.QEvent.Show:
#....
self.update_subitems(root_item)

Read More...

вторник, 6 января 2009 г.

Меньше кодить, больше думать

Джордж Сантаяне: Фанатизм состоит в удвоении Вашего усилия, когда Вы забыли свою цель

Первый пост в этом году будет обещанием самому себе - не писать ни строки кода пока не будет до конца ясно зачем это надо. Под этим я имею ввиду, что каждая задача должна разбиваться на подзадачи (строки кода) только когда понятна сама задача (зачем это надо). Делать наоборот - на ходу придумывать подзадачи и подгонять их под конкретную задачу - пустая трата времени и источник ошибок.

Read More...