Уведомления

Группа в Telegram: присоединиться | Jabber-конференция сообщества: pythonua@conference.jabber.ru

#1 Янв. 12, 2018 18:13:45

InterVi
Зарегистрирован: 2016-09-09
Сообщения: 49
Репутация: +  2  -
Профиль   Отправить e-mail  

DeWidgets - Qt5 виджеты на рабочий стол


Написал виджеты, т.к. в линуксе на некоторых DE их просто нет. На данный момент есть 7 виджетов:
  • Заметки
  • Таймер
  • Мониторинг Monecraft серверов
  • Часы
  • Зашифрованая заметка
  • Мониторинг процессора
  • Мониторинг ОЗУ и подкачки

Есть возможность установки своих виджетов из архива, написана справка. В будущем планируется добавить английскую локализацю и опакетить.

Реп: https://github.com/InterVi/DeWidgets

От вас хочется узнать мнение о коде, возможно я что-то делаю не так. Вот что сам могу сказать:
  • Не всегда используются конструкторы. Например, для QLabel - я устанавливаю текст через setText.
  • Возможно, было бы правильней во многих местах применить QGridLayout. Но мне больше нравится играть с горизонтальными и вертикальными.
  • В некоторых местах названия переменных не информативны, а в некоторых могут вовсе запутать. Не считая мелочей, вроде коротких циклов, где содержание переменной очевидно.
  • Есть подозрение, что можно было бы составить более эффективную архитектуру кода виджетов. Например, рисовать UI только непосредственно перед отображением, чтобы не добавленные на стол виджеты ели меньше ресурсов.

Считаю это всё мелочами, хотя возможно и проведу рефакторинг.

Офлайн

#2 Янв. 12, 2018 18:44:44

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 6576
Репутация: +  446  -
Профиль   Отправить e-mail  

DeWidgets - Qt5 виджеты на рабочий стол

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())

и так каждый метод. Объясните смысл происходящего.



Офлайн

#3 Янв. 12, 2018 20:49:41

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 1747
Репутация: +  117  -
Профиль   Отправить e-mail  

DeWidgets - Qt5 виджеты на рабочий стол

> От вас хочется узнать мнение о коде, возможно я что-то делаю не так.

Я посмотрел на это чудо и вот мои первые впечатления:
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'
ИХМО эти атрибуты не должны быть частью объекта окна.
7) Повальное дублирование кода. Например вот это вполне можно было-бы объединить:
 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()
Ну и так далее…





С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#4 Янв. 12, 2018 20:50:18

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 1747
Репутация: +  117  -
Профиль   Отправить e-mail  

DeWidgets - Qt5 виджеты на рабочий стол

> Объясните смысл происходящего.

Это у него так логи работают





С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#5 Янв. 13, 2018 10:37:56

InterVi
Зарегистрирован: 2016-09-09
Сообщения: 49
Репутация: +  2  -
Профиль   Отправить e-mail  

DeWidgets - Qt5 виджеты на рабочий стол

Да, это для логов, stdout и stderr пишутся в файл. Если не принтить, будет тишина и никакого дебага. Если не обрабатывать, упадёт всё приложение от мелкого бага в виджете.

Rodegast
1) Используй дизайнер.
Это который QDesigner, где формочки рисуются? Вредный совет - его код отвратителен. А во многих случаях лучше делать на лаяутах.
Rodegast
2) Наследование диалогов от QWidget.
А что в этом не так? Если не наследовать - закроется вся программа (в большинстве случаев). Такой уж странный Qt. В некоторых частях кода используется hide() для “закрытия” по той же причине. Причём эта странность по-разному ведёт себя на разных версиях Qt и hide() уже не нужен. Всё решится после тестирования, если оно будет.
Rodegast
3) Перевод сообщений на иностранные языки не надо хранить как конф. файл. Используй gettext или стандартную систему перевода Qt.
Вот про это можно по подробнее? Как выглядит нормальная система локализации? И будет ли она эффективнее?
Rodegast
4) Кнопки которые не могут быть использованы должны быть не активными.
Насколько помню, это на главной форме и в удалении виджетов. Поправлю, вообще так и планировалось, но забыл.
Rodegast
5) Выджеты нельзя перемещать.
Как это нельзя? Можно - кнопочка в главном окне открывает меню. У тех виджетов, что создают множество экземпляров, она в настройках виджета.
Rodegast
ИХМО эти атрибуты не должны быть частью объекта окна.
А ещё это объект главного класса, реализующий API. Он хранится в памяти для доступа из разных частей и эти атрибуты нужны. Где тогда их хранить? Делить на два класса, где второй будет окном и именно его подгружать динамически, для экономии? Возможно я это реализую, если придумаю такую структуру, ради которой не придётся переписывать весь существующий код.
Rodegast
7) Повальное дублирование кода. Например вот это вполне можно было-бы объединить:
Попробую сделать модуль с типовыми решениями. Может получится так, что вызов функции с кучей параметров будет занимать не меньше строк, чем создание диалога. А в более позднем коде я таки научился использовать конструткторы, хотя они не сильно сэкономили строки. А где ещё есть дублирование, кроме диалогов?
Rodegast
Ну и так далее…
больше критики) мне же надо код исправлять перед опакечиванием, а с текущей скоростью, оно близко

Офлайн

#6 Янв. 13, 2018 13:09:31

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 1747
Репутация: +  117  -
Профиль   Отправить e-mail  

DeWidgets - Qt5 виджеты на рабочий стол

> Да, это для логов, stdout и stderr пишутся в файл

Для логирования есть соответствующий модуль. И научись пользоваться декораторами.

> его код отвратителен

А тебе какая разница? Ты его в ручную править не будешь.

> А что в этом не так?

Диалоги нужно наследовать от QDialog по моему это очевидно.

> Вот про это можно по подробнее?

Нагугли gettext. В чём проблема?

> Как это нельзя? Можно - кнопочка в главном окне открывает меню.

Ты думаешь что про это кто-то догадается? Я должен потянуть за виджет и он должен переместится, должна быть возможность его закрепить, но всё это должно происходить без лишних телодвижений.

> Он хранится в памяти для доступа из разных частей и эти атрибуты нужны. Где тогда их хранить?

http://qaru.site/questions/19712/what-is-the-common-header-format-of-python-files

> больше критики) мне же надо код исправлять перед опакечиванием, а с текущей скоростью, оно близко

Ты сначала текущие косяки исправь.





С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Янв. 13, 2018 13:21:27)

Офлайн

#7 Янв. 13, 2018 14:55:34

InterVi
Зарегистрирован: 2016-09-09
Сообщения: 49
Репутация: +  2  -
Профиль   Отправить e-mail  

DeWidgets - Qt5 виджеты на рабочий стол

Rodegast
Для логирования есть соответствующий модуль.
Принтить удобнее. К тому же, stdout всё равно будет писатся в файл, это нужно для дебага и на случай если виджету нужно что-то туда выводить. Значит получится лишний лог и нужда дёргать логгер. Ну и зачем это всё? Чтобы в логе выводилось время? Туда пишется время старта и остановки, этого достаточно.
Rodegast
И научись пользоваться декораторами.
В некоторых исключениях не только принт стактрейса, там выполняются действия. Поэтому обработка ошибок всегда явная, дабы не запутывать код. Вот зачем? Ради экономии нескольких строк? Как и логгинг, в данной конкретной задаче это выпендрёж аля “смотрите как я хорошо знаю возможности языка”.
Rodegast
А тебе какая разница? Ты его в ручную править не будешь.
Вообще-то именно это я и делаю. Обработка событий, обращение к элементам из различных частей кода. Зачем менять хороший код на плохой? Вот этого я совсем не понимаю.
Rodegast
Диалоги нужно наследовать от QDialog по моему это очевидно.
QMessageBox от QDialog, что за бред? Он и так наследуются от него. Я уже говорил, это делается для решения проблемы с закрытием всего приложения. Не помню всех случаев, но если главное окно скрыто, приложение точно закроется при закрытии мессенджа. Попробуй для примера убрать наследование в криптозаметке, там есть пара мессенджей. К тому же, благодаря наследованию мессендж вылазит не в углу экрана и не надо дополнительно заниматся его позиционированием.
Rodegast
Нагугли gettext. В чём проблема?
Посмотрел, это хуже имеющегося решения. Писать длинные тексты прямо в коде программы - бред. Про стандартную систему переводов Qt ты почему-то умолчал. Можно подробности? У неё тоже есть некоторые проблемы. Например, в XFCE всё зависит от темы оформления. На каких-то темах у меня всё было на английском, а на других появлялась русская локализация (для тех частей, которые я сам из кода не трогаю). Поэтому я бы не стал на неё полагатся, если не будет каких-то серьёзных аргументов за.
Rodegast
Ты думаешь что про это кто-то догадается? Я должен потянуть за виджет и он должен переместится, должна быть возможность его закрепить, но всё это должно происходить без лишних телодвижений.
Он и так закреплённый. Можно включить галочку редактирования в главном меню, тогда у всех виджетов появятся окошки и их можно быстро раскидать. Хорошим решением было бы добавить плашки для перетаскивания, которые вылезают с нужной стороны. Но я пока плохо представляю как это реализовать по-проще, без сотен строк кода. Скорее всего в будущем они появятся, а пока и так удобно. Попиксельного выравнивания очень нехватает у другого ПО для виджетов, приходится глаза ломать.
Rodegast
http://qaru.site/questions/19712/what-is-the-common-header-format-of-python-files
Это бред. Модуль не хранится в памяти, только главный класс. Как реализовать наследование у модуля, чтобы не реализовывать каждый раз всё API? А ведь ещё надо будет написать большой валидатор (сейчас это всего лишь пара проверок). И опять же - ради чего? В чём конкретная выгода?

Меня не интересует превращение проекта в нечитаемое нечто, чтобы выпендриватся на форумах в стиле “ахаха, мой проект такой сложный что вы там нихрена не поймёте”, ради непонятно чего (о котретной выгоде предложенных решений я так и не услышал). Тем более что ты уже и так показал то, что не понимаешь его структуру, хотя там всё очень просто.

Можно по делу? Как с кнопками и плохим перетаскиванием.

Офлайн

#8 Янв. 13, 2018 16:32:15

InterVi
Зарегистрирован: 2016-09-09
Сообщения: 49
Репутация: +  2  -
Профиль   Отправить e-mail  

DeWidgets - Qt5 виджеты на рабочий стол

Rodegast
Диалоги нужно наследовать от QDialog по моему это очевидно.
Точно бред. Там же вообще не наследование. QMessageBox наследует QDialog, а QDialog наследует QWidget. Передавать владельца нужно вот для чего:
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)

Офлайн

#9 Янв. 13, 2018 20:47:10

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 1747
Репутация: +  117  -
Профиль   Отправить e-mail  

DeWidgets - Qt5 виджеты на рабочий стол

> Зачем менять хороший код на плохой? Вот этого я совсем не понимаю.

Я у тебя “хорошего кода” ещё не видел.

> QMessageBox от QDialog, что за бред?

Где я писал про QMessageBox? Вот что имелось в виду:

 class Help(QWidget):
    """help window"""
    def __init__(self, lang):

> Посмотрел, это хуже имеющегося решения.

Это технологический стандарт.

> Про стандартную систему переводов Qt ты почему-то умолчал. Можно подробности?

В целом она примерно такая-же, но у неё есть определённые недостатки из-за которых я ей не пользуюсь.

> Можно включить галочку редактирования в главном меню, тогда у всех виджетов появятся окошки и их можно быстро раскидать

Я эту галочку включаю и ничего такого не происходит.

> Это бред. Модуль не хранится в памяти, только главный класс.

Например возьмём виджет digital_time. Каким образом будут использоваться вот эти атрибуты?
         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'





С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#10 Янв. 13, 2018 21:50:54

InterVi
Зарегистрирован: 2016-09-09
Сообщения: 49
Репутация: +  2  -
Профиль   Отправить e-mail  

DeWidgets - Qt5 виджеты на рабочий стол

Rodegast
Где я писал про QMessageBox? Вот что имелось в виду:
Ну и? Это же гуй с текстом и кнопочками, от чего мне его наследовать? И причём тут QDialog, который всё равно наследует QWidget?
Rodegast
Это технологический стандарт.
Это не значит, что его нужно тащить во всё, особенно когда есть километровые строки, а по другому стандарту они должны быть < 80. Просто ради того, что стандарт? Других преимуществ нет?
Rodegast
Я эту галочку включаю и ничего такого не происходит.
У виджетов на рабочием столе не появляются рамки? Есть ошибки в логах, какая версия Python и Qt?
Rodegast
Например возьмём виджет digital_time. Каким образом будут использоваться вот эти атрибуты?
Эта информация выводится если дважды кликнуть по виджету в списке. А NAME - ключ для словаря с виджетами и конфига, используется во многих местах. DESCRIPTION выводится в подсказках, а ICON в списке. Если и выносить эту информацию, так в отдельный класс, который будет лежать в отдельном словаре и наследоватся главным классом. Попробую написать такую структуру.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version