Комментарии 24
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
(set-language-environment 'UTF-8)
(setq default-input-method 'russian-computer)
(set-selection-coding-system 'windows-1251)
(set-default-coding-systems 'windows-1251)
(prefer-coding-system 'windows-1251)
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(default ((t (:inherit nil :stipple nil :background «gray17» :foreground «snow» :inverse-video nil :box nil :strike-through nil :overline nil :underline nil :slant normal :weight normal :height 98 :width normal :foundry «outline» :family «Courier New»))))
'(cursor ((t (:background «peach puff»))))
'(font-lock-comment-delimiter-face ((default (:inherit font-lock-comment-face)) (((class color) (min-colors 16)) (:background «green»))))
'(font-lock-comment-face ((nil nil)))
'(font-lock-doc-face ((t (:inherit font-lock-string-face :background «black»)))))
(setq auto-mode-alist
(append
'(
( "\\.el$". lisp-mode)
( "\\.py$". python-mode)
( "\\.html$". sgml-mode)
( "\\.xml$". sgml-mode)
)))
(global-font-lock-mode 1)
(autoload 'javascript-mode «javascript» nil t)
(add-to-list 'auto-mode-alist '("\\.js\\'". javascript-mode))
;; tool bar
(tool-bar-mode -1)
(set-background-color "#333333")
(set-foreground-color "#ffffff")
(setq scroll-step 1)
(global-hl-line-mode 1)
(windmove-default-keybindings 'meta)
(fset 'yes-or-no-p 'y-or-n-p)
(iswitchb-mode 1)
(global-set-key [?\C-,] 'previous-buffer)
(global-set-key [?\C-.] 'next-buffer)
(put 'upcase-region 'disabled nil)
(delete-selection-mode 1)
;;(setq inhibit-startup-message t)
(setq default-tab-width 4)
(desktop-save-mode t)
(global-set-key [f5] 'call-last-kbd-macro)
(global-set-key [f11] 'buffer-menu)
(global-set-key [f10] 'bookmark-bmenu-list)
(global-set-key [?\C-'] 'toggle-truncate-lines)
(put 'narrow-to-page 'disabled nil)
что не понравится (set-language-environment 'UTF-8)
(setq default-input-method 'russian-computer)
(set-selection-coding-system 'windows-1251)
(set-default-coding-systems 'windows-1251)
(prefer-coding-system 'windows-1251)
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(default ((t (:inherit nil :stipple nil :background «gray17» :foreground «snow» :inverse-video nil :box nil :strike-through nil :overline nil :underline nil :slant normal :weight normal :height 98 :width normal :foundry «outline» :family «Courier New»))))
'(cursor ((t (:background «peach puff»))))
'(font-lock-comment-delimiter-face ((default (:inherit font-lock-comment-face)) (((class color) (min-colors 16)) (:background «green»))))
'(font-lock-comment-face ((nil nil)))
'(font-lock-doc-face ((t (:inherit font-lock-string-face :background «black»)))))
(setq auto-mode-alist
(append
'(
( "\\.el$". lisp-mode)
( "\\.py$". python-mode)
( "\\.html$". sgml-mode)
( "\\.xml$". sgml-mode)
)))
(global-font-lock-mode 1)
(autoload 'javascript-mode «javascript» nil t)
(add-to-list 'auto-mode-alist '("\\.js\\'". javascript-mode))
;; tool bar
(tool-bar-mode -1)
(set-background-color "#333333")
(set-foreground-color "#ffffff")
(setq scroll-step 1)
(global-hl-line-mode 1)
(windmove-default-keybindings 'meta)
(fset 'yes-or-no-p 'y-or-n-p)
(iswitchb-mode 1)
(global-set-key [?\C-,] 'previous-buffer)
(global-set-key [?\C-.] 'next-buffer)
(put 'upcase-region 'disabled nil)
(delete-selection-mode 1)
;;(setq inhibit-startup-message t)
(setq default-tab-width 4)
(desktop-save-mode t)
(global-set-key [f5] 'call-last-kbd-macro)
(global-set-key [f11] 'buffer-menu)
(global-set-key [f10] 'bookmark-bmenu-list)
(global-set-key [?\C-'] 'toggle-truncate-lines)
(put 'narrow-to-page 'disabled nil)
это часть .emacs которая для меня особо необходима. попробуйте.
(setq default-input-method 'russian-computer)
(set-selection-coding-system 'windows-1251)
(set-default-coding-systems 'windows-1251)
(prefer-coding-system 'windows-1251)
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(default ((t (:inherit nil :stipple nil :background «gray17» :foreground «snow» :inverse-video nil :box nil :strike-through nil :overline nil :underline nil :slant normal :weight normal :height 98 :width normal :foundry «outline» :family «Courier New»))))
'(cursor ((t (:background «peach puff»))))
'(font-lock-comment-delimiter-face ((default (:inherit font-lock-comment-face)) (((class color) (min-colors 16)) (:background «green»))))
'(font-lock-comment-face ((nil nil)))
'(font-lock-doc-face ((t (:inherit font-lock-string-face :background «black»)))))
(setq auto-mode-alist
(append
'(
( "\\.el$". lisp-mode)
( "\\.py$". python-mode)
( "\\.html$". sgml-mode)
( "\\.xml$". sgml-mode)
)))
(global-font-lock-mode 1)
(autoload 'javascript-mode «javascript» nil t)
(add-to-list 'auto-mode-alist '("\\.js\\'". javascript-mode))
;; tool bar
(tool-bar-mode -1)
(set-background-color "#333333")
(set-foreground-color "#ffffff")
(setq scroll-step 1)
(global-hl-line-mode 1)
(windmove-default-keybindings 'meta)
(fset 'yes-or-no-p 'y-or-n-p)
(iswitchb-mode 1)
(global-set-key [?\C-,] 'previous-buffer)
(global-set-key [?\C-.] 'next-buffer)
(put 'upcase-region 'disabled nil)
(delete-selection-mode 1)
;;(setq inhibit-startup-message t)
(setq default-tab-width 4)
(desktop-save-mode t)
(global-set-key [f5] 'call-last-kbd-macro)
(global-set-key [f11] 'buffer-menu)
(global-set-key [f10] 'bookmark-bmenu-list)
(global-set-key [?\C-'] 'toggle-truncate-lines)
(put 'narrow-to-page 'disabled nil)
что не понравится (set-language-environment 'UTF-8)
(setq default-input-method 'russian-computer)
(set-selection-coding-system 'windows-1251)
(set-default-coding-systems 'windows-1251)
(prefer-coding-system 'windows-1251)
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(default ((t (:inherit nil :stipple nil :background «gray17» :foreground «snow» :inverse-video nil :box nil :strike-through nil :overline nil :underline nil :slant normal :weight normal :height 98 :width normal :foundry «outline» :family «Courier New»))))
'(cursor ((t (:background «peach puff»))))
'(font-lock-comment-delimiter-face ((default (:inherit font-lock-comment-face)) (((class color) (min-colors 16)) (:background «green»))))
'(font-lock-comment-face ((nil nil)))
'(font-lock-doc-face ((t (:inherit font-lock-string-face :background «black»)))))
(setq auto-mode-alist
(append
'(
( "\\.el$". lisp-mode)
( "\\.py$". python-mode)
( "\\.html$". sgml-mode)
( "\\.xml$". sgml-mode)
)))
(global-font-lock-mode 1)
(autoload 'javascript-mode «javascript» nil t)
(add-to-list 'auto-mode-alist '("\\.js\\'". javascript-mode))
;; tool bar
(tool-bar-mode -1)
(set-background-color "#333333")
(set-foreground-color "#ffffff")
(setq scroll-step 1)
(global-hl-line-mode 1)
(windmove-default-keybindings 'meta)
(fset 'yes-or-no-p 'y-or-n-p)
(iswitchb-mode 1)
(global-set-key [?\C-,] 'previous-buffer)
(global-set-key [?\C-.] 'next-buffer)
(put 'upcase-region 'disabled nil)
(delete-selection-mode 1)
;;(setq inhibit-startup-message t)
(setq default-tab-width 4)
(desktop-save-mode t)
(global-set-key [f5] 'call-last-kbd-macro)
(global-set-key [f11] 'buffer-menu)
(global-set-key [f10] 'bookmark-bmenu-list)
(global-set-key [?\C-'] 'toggle-truncate-lines)
(put 'narrow-to-page 'disabled nil)
это часть .emacs которая для меня особо необходима. попробуйте.
-4
а не расскажете про упаковку приложения в py2exe? а то с pyqt4 постоянно какие-то проблемы возникают
+2
Обратите внимание на PyInstaller — малоизвестный инструмент, между тем превосходящий по фичам и удобству упомянутый py2exe.
Один из ключевых моментов — автоматически распознает и подключает PyQt/lxml и прочие библиотеки. Т.е. не надо делать абсолютно никаких телодвижений — оно работает «из коробки».
Впрочем, для объективности отмечу и минусы — для поддержки .manifest файлов требует патча (не знаю как с этим у py2exe), и лучше использовать SVN-ветку программы т.к. они почему-то уже год с лишним как не хотят выкладывать на публику версии своей утилиты, несмотря на то, что работает отлично и разработка идет, проект не мертв.
Один из ключевых моментов — автоматически распознает и подключает PyQt/lxml и прочие библиотеки. Т.е. не надо делать абсолютно никаких телодвижений — оно работает «из коробки».
Впрочем, для объективности отмечу и минусы — для поддержки .manifest файлов требует патча (не знаю как с этим у py2exe), и лучше использовать SVN-ветку программы т.к. они почему-то уже год с лишним как не хотят выкладывать на публику версии своей утилиты, несмотря на то, что работает отлично и разработка идет, проект не мертв.
+1
Хотелось бы видеть в начале статьи краткую аннотацию с описанием того, что конкретно делает ваша программа.
Прочитать неподсвеченный код без комментариев — весьма сомнительное удовольствие, особенно не зная что там должно быть.
Какая цель этой статьи? Кому должна быть полезна?
Тот кто не знает PyQt от такого изложения не поймет ничего. А кто знает, скажет вам, что код ваш откровенно средненького качества.
Опишите интересные и полезные, на ваш взгляд, моменты, а скачивание кода сделайте архивом — так всем и проще и удобней — можно не только прочитать, но и самостоятельно запустить или подредактировать.
Если сейчас там есть какие-то достойные моменты — то их не видно в вашей куче. Если нет — то незачем писать статью.
В данный момент все это похоже на «Я вот сделал за вечер на коленке программку, посмотрите какой я молодец, вот ее исходник».
Прочитать неподсвеченный код без комментариев — весьма сомнительное удовольствие, особенно не зная что там должно быть.
Какая цель этой статьи? Кому должна быть полезна?
Тот кто не знает PyQt от такого изложения не поймет ничего. А кто знает, скажет вам, что код ваш откровенно средненького качества.
Опишите интересные и полезные, на ваш взгляд, моменты, а скачивание кода сделайте архивом — так всем и проще и удобней — можно не только прочитать, но и самостоятельно запустить или подредактировать.
Если сейчас там есть какие-то достойные моменты — то их не видно в вашей куче. Если нет — то незачем писать статью.
В данный момент все это похоже на «Я вот сделал за вечер на коленке программку, посмотрите какой я молодец, вот ее исходник».
+7
Я бы такую статью бы с удовольствием прочитал ранее, статья не салат-копипаст. полезна для тех, кто часто пишет комменты типа «скоро буду изучать питон».
>А кто знает, скажет вам, что код ваш откровенно средненького качества.
Вы подскажите что не так, я подучусь.
а скачивание кода сделайте архивом
а разве я не так сделал.
А вообще ваш коммент заменить на — «вы мне не нравитесь. я умнее.»
>А кто знает, скажет вам, что код ваш откровенно средненького качества.
Вы подскажите что не так, я подучусь.
а скачивание кода сделайте архивом
а разве я не так сделал.
А вообще ваш коммент заменить на — «вы мне не нравитесь. я умнее.»
0
Уважаемый, ну зачем сразу же так агрессивно…
Я приношу извинения, если тон или стиль моего изложения задел вас, и вовсе не хочу сказать, что имею что-то против вас лично. Напротив, выложить свой код на суд общественности — смелое решение и в полной мере достойно уважения.
Лишь хочу сказать, что в данной статье не хватает (помимо подсветки кода) некоторой центральной идеи.
Говорю о том, что читателю вряд ли нужна точно такая программа, как есть у вас. Читатель хочет научиться чему-то, каким-то принципам, каким-то приемам.
Потому полезно ткнуть пальцем «вот тут сделано то-то так-то потому, что...». А учиться лишь по одному исходнику способны гики, которые вряд ли обучаются программированию на хабре.
Я приношу извинения, если тон или стиль моего изложения задел вас, и вовсе не хочу сказать, что имею что-то против вас лично. Напротив, выложить свой код на суд общественности — смелое решение и в полной мере достойно уважения.
Лишь хочу сказать, что в данной статье не хватает (помимо подсветки кода) некоторой центральной идеи.
Говорю о том, что читателю вряд ли нужна точно такая программа, как есть у вас. Читатель хочет научиться чему-то, каким-то принципам, каким-то приемам.
Потому полезно ткнуть пальцем «вот тут сделано то-то так-то потому, что...». А учиться лишь по одному исходнику способны гики, которые вряд ли обучаются программированию на хабре.
0
На вас не обижаюсь, даже буду рад если дадите какое-то ценное указание.
код ваш откровенно средненького качества.
аргументируйте, хоть как-то.
код ваш откровенно средненького качества.
аргументируйте, хоть как-то.
+1
Не обижайтесь, пожалуйста, но код похож либо на то, что вы очень торопились, и главное было сделать программу с заданными функциями в заданный срок, либо вы еще изучаете инструментарий.
Например участок с конфигурационным файлом. Вместо
можно использовать простое и понятное
Кроме читаемости это будет соответствовать принципам «Simple is better than complex», «Namespaces are one honking great idea» и другим, включенным в The Zen of Python.
Так же, например, код:
Читая его получаем:
Отсюда сразу встают вопросы, что за ListWidget, что за элементы в нем хранятся, каково их назначение, и почему функция «завершить файл» вместо того, чтобы завершать этот файл, лишь констатирует факт что файл завершен.
Я не претендую на истинность своих слов, это лишь результат быстрой выкладки, но можно было бы переписать так:
Ваш код весьма запутан, а хорошая программа всегда имеет простой (не путать с примитивностью) код, даже если эта программа сама по себе крайне сложна.
Например участок с конфигурационным файлом. Вместо
mod = __import__(modName)
host = getattr(mod, 'host', 'horn:intur')
user = getattr(mod, 'user', 'SYSDBA')
можно использовать простое и понятное
import settings
… settings.host…
… settings.user…
Кроме читаемости это будет соответствовать принципам «Simple is better than complex», «Namespaces are one honking great idea» и другим, включенным в The Zen of Python.
Так же, например, код:
def completeFile(self, i):
… widget = self.ui.listWidget
… text = widget.item(i).text()
… widget.item(i).setText('%s\t%s' % (text, u'готово'))
… self.ui.progressBar.setValue(0)
Читая его получаем:
функция «завершить i-й файл»:
… На форме у нас есть некоторый ListWidget, возьмем его
… Допишем к тексту i-го элемента в нем слово «готово»
… Возьмем некоторый прогрессбар на форме и установлим его прогресс в 0.
Отсюда сразу встают вопросы, что за ListWidget, что за элементы в нем хранятся, каково их назначение, и почему функция «завершить файл» вместо того, чтобы завершать этот файл, лишь констатирует факт что файл завершен.
Я не претендую на истинность своих слов, это лишь результат быстрой выкладки, но можно было бы переписать так:
def file_completed(self, file_index):
… file_item = self.ui.file_list.item(file_index)
… file_item.setText( '%s\t%s' % (file_item.text(), u'готово') )
… self.ui.current_file_progress.setValue(0)
Ваш код весьма запутан, а хорошая программа всегда имеет простой (не путать с примитивностью) код, даже если эта программа сама по себе крайне сложна.
+1
То что, вы указали весьма спорно:
1. В моем случае скрипт запустится при незаполненных переменных host, user. В вашем случае он упадет, __import__(modName), позволяет вынести в начало файла название скрипта настроек, у вас он вбит внутри код, что не есть хорошо.
2. Во втором случае, вы меня потрясли))
Переименовать названия виджетов — это признак большой искусности программиста.
По-моему код прозрачен, вот сущности выполняющие основные действия:
Container — (пре запуск программы, проверка настроек)
-->Wnd — (класс окошка и отрисовка виджетов)
----->MainModel — управление парсингом и загрузкой
--------->DbConn — контейнер sql, и подключение к БД.
1. В моем случае скрипт запустится при незаполненных переменных host, user. В вашем случае он упадет, __import__(modName), позволяет вынести в начало файла название скрипта настроек, у вас он вбит внутри код, что не есть хорошо.
2. Во втором случае, вы меня потрясли))
Переименовать названия виджетов — это признак большой искусности программиста.
По-моему код прозрачен, вот сущности выполняющие основные действия:
Container — (пре запуск программы, проверка настроек)
-->Wnd — (класс окошка и отрисовка виджетов)
----->MainModel — управление парсингом и загрузкой
--------->DbConn — контейнер sql, и подключение к БД.
-2
1. Если меняется название скрипта настроек, то имеет смысл обратиться к модулю ConfigParser и вынести настройки в ini-файл, оставив при этом в покое сам модуль конфигурационного файла.
2. Идеи правильного именования вы найдете в таких трудах, как «Совершенный код» (глава 11), «Domain driven development» и многих других.
Позволю себе привести отрывок из первой упомянутой книги:
Попробуйте читать код после обфускатора, если считаете что стиль и имена переменных не имеют значения.
2. Идеи правильного именования вы найдете в таких трудах, как «Совершенный код» (глава 11), «Domain driven development» и многих других.
Позволю себе привести отрывок из первой упомянутой книги:
Имя переменной нельзя выбирать, как кличку собаке:… В отличие от собаки и ее клички, которые являются разными сущностями, переменная и ее имя формируют по идее одну сущность. Поэтому и адекватность переменной во многом определяется ее именем. Выбирайте имена переменных со всей тщательностью.
Попробуйте читать код после обфускатора, если считаете что стиль и имена переменных не имеют значения.
+2
2. Найдите хоть одну здравую программу на питоне которая использует ini-файлы.
1. имена переменных и виджетов абсолютно разные вещи возьмите любой gui-туториал от qt, и посмотрите там имена виджетов. Это не принципиально потому что, в на форме может быть сотня виджетов и важдому присваивать имя это никому не нужная работа.
Имена переменных в моем коде все корректны.
1. имена переменных и виджетов абсолютно разные вещи возьмите любой gui-туториал от qt, и посмотрите там имена виджетов. Это не принципиально потому что, в на форме может быть сотня виджетов и важдому присваивать имя это никому не нужная работа.
Имена переменных в моем коде все корректны.
-4
1. Давайте не доводить до абсурда. Если вам не нравится формат INI — сделайте в XML, YAML или любом другом формате, который вам нравится.
Суть не в конкретном формате, а в том, что есть модуль Settings, в котором есть параметры.
Откуда они там берутся — это проблема модуля settings и никакого другого модуля программы.
2. Про переменные даже отвечать не буду. Я вам привел ссылки на литературу, считаю что этого достаточно.
Суть не в конкретном формате, а в том, что есть модуль Settings, в котором есть параметры.
Откуда они там берутся — это проблема модуля settings и никакого другого модуля программы.
2. Про переменные даже отвечать не буду. Я вам привел ссылки на литературу, считаю что этого достаточно.
+1
Статья содержит пару идеологических просчётов:
1. Исходники в cp1251. Что не самое страшное, пока код не выпускается из ваших рук.
2. Просчёт похуже: скриншоты текста в jpg
это не xkcd, не ищете текста alt
1. Исходники в cp1251. Что не самое страшное, пока код не выпускается из ваших рук.
2. Просчёт похуже: скриншоты текста в jpg
это не xkcd, не ищете текста alt
+8
В принципе пост хороший, но уж больно «галопом по Европам». Пример написания гуевого приложения, работающего с БД, рассчитаный на новичковую аудиторию, имхо, лучше бы расписать подетальнее и пообширнее — и это задача не из простых. Не менее интересны и комментарии к тексту!
+2
Ссылки с кодом не рабочие…
0
на гитхабе выложить не можете? а то ссылки уже на рабочие
0
Зарегистрируйтесь на Хабре , чтобы оставить комментарий
Пример разработки небольшого python+PyQt4 приложения для учетной системы