Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Создание своего виджета  (Прочитано 2478 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн bastion

  • Автор темы
  • Любитель
  • *
  • Сообщений: 94
  • Python / Qt
    • Просмотр профиля
    • Искусство креативного массажа
Создание своего виджета
« : 12 Ноября 2014, 09:47:28 »
Добрый день!
Написал виджет для отображения сетевой активности, байты туда байты сюда.
Все это python+Qt (PyQt Ubuntu 12.04 Unity). Работае отлично.
Естественно когда запускаю - на панели приложений вылазит иконка запущенного скрипта.
Хотел сделать так, чтобы скрипт работал в фоновом режиме без занятой консоли и без индикации в панели приложений (ну как в конки).
Пробовал через os.fork(), пробовал через start-stop-daemon... все работает но каждый раз вылазит на панель приложений.

Как сделать так чтобы скрипт работал полностью в фоновом режиме?
Готов взяться за любую работу, при условии, что за нее не нужно приниматься прямо сейчас

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 3031
    • Просмотр профиля
Re: Создание своего виджета
« Ответ #1 : 12 Ноября 2014, 23:30:43 »
Наверное, надо сделать его демоном. Python я не знаю. В книге Робачевского
"Операционная система UNIX" рассказано, как сделать демоном программу на C, см. "Демон".
Во всяком случае, надо отключить реакцию на сигналы с терминала,
закрыть все стандартные потоки ввода/вывода,
отключиться от терминала и от запустившего его процесса, он должен сам
стать лидером новой группы (setsid()).
Пётр.

Оффлайн bastion

  • Автор темы
  • Любитель
  • *
  • Сообщений: 94
  • Python / Qt
    • Просмотр профиля
    • Искусство креативного массажа
Re: Создание своего виджета
« Ответ #2 : 12 Ноября 2014, 23:52:52 »
Наверное, надо сделать его демоном...
Ну да я согласен. Перечитал мануалы как работает start-stop-daemon в ubuntu...
Проблема что запустить напрямую python приложение не удается возвращает (Exec format error), а если запускать через sh скрипт, то удается освободить консоль но при старте приложения - все равно вылазит на панель.
Ну чтоже, может полноценный daemon сервис нужно писать только на bash или C++
Готов взяться за любую работу, при условии, что за нее не нужно приниматься прямо сейчас

Оффлайн RingOV

  • Активист
  • *
  • Сообщений: 764
    • Просмотр профиля
Re: Создание своего виджета
« Ответ #3 : 02 Декабря 2014, 14:09:04 »
bastion,
Иконка на панели это свойство окна.
На Gtk просто window.set_skip_taskbar_hint(True) и иконки нет.
На Qt нужно искать что-то подобное.
Вот это нагуглилось можно попробовать setWindowFlags(QtCore.Qt.SplashScreen)

Можете поделиться скриптом?

Оффлайн bastion

  • Автор темы
  • Любитель
  • *
  • Сообщений: 94
  • Python / Qt
    • Просмотр профиля
    • Искусство креативного массажа
Re: Создание своего виджета
« Ответ #4 : 09 Декабря 2014, 12:16:46 »
bastion,
Иконка на панели это свойство окна.
На Gtk просто window.set_skip_taskbar_hint(True) и иконки нет.
На Qt нужно искать что-то подобное.
Вот это нагуглилось можно попробовать setWindowFlags(QtCore.Qt.SplashScreen)
:D Это оно!!! Спасибо.
Я был так уверен, что свойство окна это вопрос к ОС, что совсем не подумал, что это можно решить через флаги Qt.
Спасибо еще раз )

Можете поделиться скриптом?
Для фильтрации пакетов использую psutil (не помню идет ли по умолчанию с питоном)
from PyQt4 import QtCore, QtGui
import psutil, sys, os

class MainWindow(QtGui.QFrame):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.FramelessWindowHint | QtCore.Qt.SplashScreen)
self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
self.setFixedSize(310, 20)
screen = QtGui.QDesktopWidget().screenGeometry()
self.move(screen.width()//2-155, 35)
self.setObjectName("Net")
self.setStyleSheet("""
QLabel {color: #ffffff; font: 14px Arial;}
""")
self.sent = self.recv = None
self.generate()
def paintEvent(self, Event):
paint = QtGui.QPainter(self)
paint.setRenderHint(QtGui.QPainter.Antialiasing)
paint.setOpacity(0.6)
paint.setPen(QtGui.QPen(QtGui.QColor("#39b4dc")))
paint.setFont(QtGui.QFont("Arial", 10))
paint.drawText(0, 0, 70, 20, QtCore.Qt.AlignRight, "Sent:")
paint.drawText(80, 0, 70, 20, QtCore.Qt.AlignLeft, self.sent)
paint.drawText(160, 0, 70, 20, QtCore.Qt.AlignRight, "Received:")
paint.drawText(240, 0, 70, 20, QtCore.Qt.AlignLeft, self.recv)
def generate(self):
self.current_sent = psutil.net_io_counters().bytes_sent
self.current_recv = psutil.net_io_counters().bytes_recv
self.source()
timer = QtCore.QTimer(self)
timer.timeout.connect(self.source)
timer.start(1000)
def source(self):
finish_sent = psutil.net_io_counters().bytes_sent
finish_recv = psutil.net_io_counters().bytes_recv
self.get_sent = (finish_sent - self.current_sent)
self.get_recv = (finish_recv - self.current_recv)
if 1000000 > self.get_sent >= 1000:
self.sent = "%d kB/s" % (self.get_sent//1000)
elif self.get_sent >= 1000000:
self.sent = "%0.1f Mb/s" % (self.get_sent/1000000)
else:
self.sent = "%d b/s" % (self.get_sent)
if 1000000 > self.get_recv >= 1000:
self.recv = "%d kB/s" % (self.get_recv//1000)
elif self.get_recv >= 1000000:
self.recv = "%0.1f Mb/s" % (self.get_recv/1000000)
else:
self.recv = "%d b/s" % (self.get_recv)
self.current_sent = finish_sent
self.current_recv = finish_recv
self.update()
def keyPressEvent(self, event):
if (event.modifiers() == QtCore.Qt.ControlModifier) & (event.key() == QtCore.Qt.Key_Q):
self.close()

if __name__ == "__main__":
pid = os.fork()
app = QtGui.QApplication(sys.argv)
portal = MainWindow()
portal.show()
sys.exit(app.exec_())
« Последнее редактирование: 09 Декабря 2014, 12:26:09 от bastion »
Готов взяться за любую работу, при условии, что за нее не нужно приниматься прямо сейчас

Оффлайн RingOV

  • Активист
  • *
  • Сообщений: 764
    • Просмотр профиля
Re: Создание своего виджета
« Ответ #5 : 09 Декабря 2014, 12:26:09 »
Если просто хочешь посмотреть, как делал на python3 + Qt могу голый сценарий выложить
Просто исходники, просто посмотреть)
Можно в ЛС.

Оффлайн bastion

  • Автор темы
  • Любитель
  • *
  • Сообщений: 94
  • Python / Qt
    • Просмотр профиля
    • Искусство креативного массажа
Re: Создание своего виджета
« Ответ #6 : 09 Декабря 2014, 12:32:51 »
Цитировать
Просто исходники, просто посмотреть)
Можно в ЛС.
Перепутал, писал такой же виджет погодный как и ты, думал говорим о нем,
потом глянул, а я то тему начал про тот что сетевую активность показывает )))
Выложил исходинк в предыдущем ответе
Готов взяться за любую работу, при условии, что за нее не нужно приниматься прямо сейчас

 

Страница сгенерирована за 0.03 секунд. Запросов: 25.