Пытаюсь для себя реализовать сенсор состояния интернет соединения. ОС Unity Ubuntu 12.04 LTS. (NetworkManager удалил, а сторонние ставить не хочу)
Задача его, отображать иконку в трее в зависимости от состояния соединения и при смене состояния менять иконку на соответствующую.
Вот собственно сам скрипт:
#! /usr/bin/env python3.2
from PyQt4 import QtGui, QtCore
import sys, os, socket, subprocess, re
class SystrayExample(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.style = self.style()
# Переменные чекеры
self.state = 0
self.state_sum = 0
self.check_conunt_conn1 = 0
self.check_conunt_conn2 = 0
self.pr_chek1 = 1
self.pr_chek2 = 1
# Меню
self.menu = QtGui.QMenu('Menu')
# Действие для выхода из программы
self.exitAction = self.menu.addAction(QtGui.QIcon(self.check_con()),'Exit')
# Ожидание сигнала для выхода
QtCore.QObject.connect(self.exitAction,QtCore.SIGNAL("triggered()"), self.close_prog)
# Создание трей
self.tray = QtGui.QSystemTrayIcon(QtGui.QIcon(self.check_con()), self)
self.tray.setVisible(True)
self.tray.setContextMenu(self.menu)
# Функция 1 проверки переменных и смены иконки
def pr1(self):
# print('1')
if self.check_conunt_conn1 < 1 and self.pr_chek1 > 0:
if self.tray.supportsMessages():
self.tray.showMessage('Сообщение 2', 'Соединение установлено\n'+str(self.state), 0, 7000)
self.pr_chek1 = 0
self.pr_chek2 = 1
self.tray.setIcon(QtGui.QIcon(self.check_con()))
QtCore.QTimer.singleShot(5000, self.pr2)
# Функция 2 проверки переменных и смены иконки
def pr2(self):
# print('2')
if self.check_conunt_conn1 > 0 and self.pr_chek2 > 0:
if self.tray.supportsMessages():
self.tray.showMessage('Сообщение', 'Соединение разорвано\n'+str(self.state[0]), 0, 7000)
self.pr_chek2 = 0
self.pr_chek1 = 1
self.tray.setIcon(QtGui.QIcon(self.check_con()))
QtCore.QTimer.singleShot(5000, self.pr1)
def all_check(self):
self.state = []
p = subprocess.Popen("ifconfig", shell=True, stdout = subprocess.PIPE)
out = p.stdout.read().decode("utf-8")
c = re.findall(r'inet addr\:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})', out)
if len(c) > 1:
self.state.append(1)
elif len(c) < 2:
self.state.append(0)
with open('/sys/class/net/eth0/carrier', 'r') as stat_carrier, open('/sys/class/net/eth0/operstate', 'r') as stat_operstate:
for text_carrier in stat_carrier:
if not '0' in text_carrier:
self.state.append(1)
else:
self.state.append(0)
for text_operstate in stat_operstate:
if not 'down' in text_carrier:
self.state.append(1)
else:
self.state.append(0)
try:
s = socket.create_connection((socket.gethostbyname("www.google.com"), 80), 2)
self.state.append(1)
s.close()
except:
self.state.append(0)
return self.state
# Функция проверки соединения
def check_con(self):
self.state_sum = sum(i for i in self.all_check())
if self.state_sum == 4:
self.icon_tipe = (os.path.dirname(os.path.abspath(__file__))+'/IconS/1Con.png')
self.check_conunt_conn1 = 0
self.check_conunt_conn2 += 1
if self.state_sum < 4:
self.icon_tipe = (os.path.dirname(os.path.abspath(__file__))+'/IconS/1DCon.png')
self.check_conunt_conn2 = 0
self.check_conunt_conn1 += 1
return self.icon_tipe
# Функция завершения работы
def close_prog(self):
self.close()
app = QtGui.QApplication(sys.argv)
pytest = SystrayExample()
QtCore.QTimer.singleShot(100, pytest.pr1)
sys.exit(app.exec_())
В нем хотел реализовать вывод всплывающих сообщений, но столкнулся с невозможностью задать время его отображения.
QSystemTrayIcon.showMessage (self, QString title, QString msg, MessageIcon icon = QSystemTrayIcon.Information, int msecs = 10000)
Тут последним параметром выступает "время жизни" насколько я понял. Но его изменение к примеру на 1000 не дает результатов так на 10000 и остается.
Не пойму что я делаю не так?