Форум сайта python.su
Офлайн
InterViОбработка исключений
мнение о коде
def edit_mode(self, mode): try: for widget in self.widgets: if mode: widget.setWindowFlags(Qt.WindowMinimizeButtonHint | Qt.WindowStaysOnBottomHint | Qt.Tool) widget.show() else: widget.setWindowFlags(Qt.CustomizeWindowHint | Qt.WindowStaysOnBottomHint | Qt.Tool) widget.show() self.save_conf() except: print(traceback.format_exc())
Офлайн
> От вас хочется узнать мнение о коде, возможно я что-то делаю не так.
Я посмотрел на это чудо и вот мои первые впечатления:
1) Используй дизайнер.
2) Наследование диалогов от QWidget.
3) Перевод сообщений на иностранные языки не надо хранить как конф. файл. Используй gettext или стандартную систему перевода Qt.
4) Кнопки которые не могут быть использованы должны быть не активными.
5) Выджеты нельзя перемещать.
6)
self.NAME = 'CPU Info' self.DESCRIPTION = self.lang['description'] self.HELP = self.lang['help'] self.AUTHOR = 'InterVi' self.EMAIL = 'intervionly@gmail.com' self.URL = 'https://github.com/InterVi/DeWidgets'
def _show_error(names=()): mbox = QMessageBox(parent) mbox.setIcon(QMessageBox.Critical) mbox.setWindowIcon(QIcon(ERROR)) mbox.setWindowTitle(lang['ADD_NEW']['error_title']) mbox.setText(lang['ADD_NEW']['error_text']) mbox.setStandardButtons(QMessageBox.Ok) ok = mbox.button(QMessageBox.Ok) ok.setText(lang['ADD_NEW']['error_ok_button']) ok.setToolTip(lang['ADD_NEW']['error_ok_button_tt']) if names: mbox.setInformativeText(get_str_list(names)) mbox.exec() def _show_success(names=()): mbox = QMessageBox(parent) mbox.setWindowIcon(QIcon(SUCCESS)) mbox.setIcon(QMessageBox.Information) mbox.setWindowTitle(lang['ADD_NEW']['success_title']) mbox.setText(lang['ADD_NEW']['success_text']) mbox.setStandardButtons(QMessageBox.Ok) ok = mbox.button(QMessageBox.Ok) ok.setText(lang['ADD_NEW']['success_ok_button']) ok.setToolTip(lang['ADD_NEW']['success_ok_button_tt']) if names: mbox.setInformativeText(get_str_list(names)) mbox.exec()
Офлайн
> Объясните смысл происходящего.
Это у него так логи работают
Офлайн
Да, это для логов, stdout и stderr пишутся в файл. Если не принтить, будет тишина и никакого дебага. Если не обрабатывать, упадёт всё приложение от мелкого бага в виджете.
RodegastЭто который QDesigner, где формочки рисуются? Вредный совет - его код отвратителен. А во многих случаях лучше делать на лаяутах.
1) Используй дизайнер.
RodegastА что в этом не так? Если не наследовать - закроется вся программа (в большинстве случаев). Такой уж странный Qt. В некоторых частях кода используется hide() для “закрытия” по той же причине. Причём эта странность по-разному ведёт себя на разных версиях Qt и hide() уже не нужен. Всё решится после тестирования, если оно будет.
2) Наследование диалогов от QWidget.
RodegastВот про это можно по подробнее? Как выглядит нормальная система локализации? И будет ли она эффективнее?
3) Перевод сообщений на иностранные языки не надо хранить как конф. файл. Используй gettext или стандартную систему перевода Qt.
RodegastНасколько помню, это на главной форме и в удалении виджетов. Поправлю, вообще так и планировалось, но забыл.
4) Кнопки которые не могут быть использованы должны быть не активными.
RodegastКак это нельзя? Можно - кнопочка в главном окне открывает меню. У тех виджетов, что создают множество экземпляров, она в настройках виджета.
5) Выджеты нельзя перемещать.
RodegastА ещё это объект главного класса, реализующий API. Он хранится в памяти для доступа из разных частей и эти атрибуты нужны. Где тогда их хранить? Делить на два класса, где второй будет окном и именно его подгружать динамически, для экономии? Возможно я это реализую, если придумаю такую структуру, ради которой не придётся переписывать весь существующий код.
ИХМО эти атрибуты не должны быть частью объекта окна.
RodegastПопробую сделать модуль с типовыми решениями. Может получится так, что вызов функции с кучей параметров будет занимать не меньше строк, чем создание диалога. А в более позднем коде я таки научился использовать конструткторы, хотя они не сильно сэкономили строки. А где ещё есть дублирование, кроме диалогов?
7) Повальное дублирование кода. Например вот это вполне можно было-бы объединить:
Rodegastбольше критики) мне же надо код исправлять перед опакечиванием, а с текущей скоростью, оно близко
Ну и так далее…
Офлайн
> Да, это для логов, stdout и stderr пишутся в файл
Для логирования есть соответствующий модуль. И научись пользоваться декораторами.
> его код отвратителен
А тебе какая разница? Ты его в ручную править не будешь.
> А что в этом не так?
Диалоги нужно наследовать от QDialog по моему это очевидно.
> Вот про это можно по подробнее?
Нагугли gettext. В чём проблема?
> Как это нельзя? Можно - кнопочка в главном окне открывает меню.
Ты думаешь что про это кто-то догадается? Я должен потянуть за виджет и он должен переместится, должна быть возможность его закрепить, но всё это должно происходить без лишних телодвижений.
> Он хранится в памяти для доступа из разных частей и эти атрибуты нужны. Где тогда их хранить?
http://qaru.site/questions/19712/what-is-the-common-header-format-of-python-files
> больше критики) мне же надо код исправлять перед опакечиванием, а с текущей скоростью, оно близко
Ты сначала текущие косяки исправь.
Отредактировано Rodegast (Янв. 13, 2018 13:21:27)
Офлайн
RodegastПринтить удобнее. К тому же, stdout всё равно будет писатся в файл, это нужно для дебага и на случай если виджету нужно что-то туда выводить. Значит получится лишний лог и нужда дёргать логгер. Ну и зачем это всё? Чтобы в логе выводилось время? Туда пишется время старта и остановки, этого достаточно.
Для логирования есть соответствующий модуль.
RodegastВ некоторых исключениях не только принт стактрейса, там выполняются действия. Поэтому обработка ошибок всегда явная, дабы не запутывать код. Вот зачем? Ради экономии нескольких строк? Как и логгинг, в данной конкретной задаче это выпендрёж аля “смотрите как я хорошо знаю возможности языка”.
И научись пользоваться декораторами.
RodegastВообще-то именно это я и делаю. Обработка событий, обращение к элементам из различных частей кода. Зачем менять хороший код на плохой? Вот этого я совсем не понимаю.
А тебе какая разница? Ты его в ручную править не будешь.
RodegastQMessageBox от QDialog, что за бред? Он и так наследуются от него. Я уже говорил, это делается для решения проблемы с закрытием всего приложения. Не помню всех случаев, но если главное окно скрыто, приложение точно закроется при закрытии мессенджа. Попробуй для примера убрать наследование в криптозаметке, там есть пара мессенджей. К тому же, благодаря наследованию мессендж вылазит не в углу экрана и не надо дополнительно заниматся его позиционированием.
Диалоги нужно наследовать от QDialog по моему это очевидно.
RodegastПосмотрел, это хуже имеющегося решения. Писать длинные тексты прямо в коде программы - бред. Про стандартную систему переводов Qt ты почему-то умолчал. Можно подробности? У неё тоже есть некоторые проблемы. Например, в XFCE всё зависит от темы оформления. На каких-то темах у меня всё было на английском, а на других появлялась русская локализация (для тех частей, которые я сам из кода не трогаю). Поэтому я бы не стал на неё полагатся, если не будет каких-то серьёзных аргументов за.
Нагугли gettext. В чём проблема?
RodegastОн и так закреплённый. Можно включить галочку редактирования в главном меню, тогда у всех виджетов появятся окошки и их можно быстро раскидать. Хорошим решением было бы добавить плашки для перетаскивания, которые вылезают с нужной стороны. Но я пока плохо представляю как это реализовать по-проще, без сотен строк кода. Скорее всего в будущем они появятся, а пока и так удобно. Попиксельного выравнивания очень нехватает у другого ПО для виджетов, приходится глаза ломать.
Ты думаешь что про это кто-то догадается? Я должен потянуть за виджет и он должен переместится, должна быть возможность его закрепить, но всё это должно происходить без лишних телодвижений.
RodegastЭто бред. Модуль не хранится в памяти, только главный класс. Как реализовать наследование у модуля, чтобы не реализовывать каждый раз всё API? А ведь ещё надо будет написать большой валидатор (сейчас это всего лишь пара проверок). И опять же - ради чего? В чём конкретная выгода?
http://qaru.site/questions/19712/what-is-the-common-header-format-of-python-files
Офлайн
RodegastТочно бред. Там же вообще не наследование. QMessageBox наследует QDialog, а QDialog наследует QWidget. Передавать владельца нужно вот для чего:
Диалоги нужно наследовать от QDialog по моему это очевидно.
A dialog is always a top-level widget, but if it has a parent, its default location is centered on top of the parent. It will also share the parent's taskbar entry.
Отредактировано InterVi (Янв. 13, 2018 16:32:30)
Офлайн
> Зачем менять хороший код на плохой? Вот этого я совсем не понимаю.
Я у тебя “хорошего кода” ещё не видел.
> QMessageBox от QDialog, что за бред?
Где я писал про QMessageBox? Вот что имелось в виду:
class Help(QWidget): """help window""" def __init__(self, lang):
self.NAME = 'Digital Time' self.DESCRIPTION = self.lang['description'] self.HELP = self.lang['help'] self.AUTHOR = 'InterVi' self.EMAIL = 'intervionly@gmail.com' self.URL = 'https://github.com/InterVi/DeWidgets'
Офлайн
RodegastНу и? Это же гуй с текстом и кнопочками, от чего мне его наследовать? И причём тут QDialog, который всё равно наследует QWidget?
Где я писал про QMessageBox? Вот что имелось в виду:
RodegastЭто не значит, что его нужно тащить во всё, особенно когда есть километровые строки, а по другому стандарту они должны быть < 80. Просто ради того, что стандарт? Других преимуществ нет?
Это технологический стандарт.
RodegastУ виджетов на рабочием столе не появляются рамки? Есть ошибки в логах, какая версия Python и Qt?
Я эту галочку включаю и ничего такого не происходит.
RodegastЭта информация выводится если дважды кликнуть по виджету в списке. А NAME - ключ для словаря с виджетами и конфига, используется во многих местах. DESCRIPTION выводится в подсказках, а ICON в списке. Если и выносить эту информацию, так в отдельный класс, который будет лежать в отдельном словаре и наследоватся главным классом. Попробую написать такую структуру.
Например возьмём виджет digital_time. Каким образом будут использоваться вот эти атрибуты?
Офлайн