#python #pyqt4
Есть код: import os import sys import types from collections import OrderedDict from PyQt4 import QtGui class SetTrayIcon(QtGui.QSystemTrayIcon): def __init__(self, icon, parent=None): self.icon = QtGui.QIcon(QtGui.QPixmap(icon)) self.parent = parent QtGui.QSystemTrayIcon.__init__(self, self.icon, self.parent) self.menu = QtGui.QMenu(self.parent) def setMenu(self, menu=None): """Устанавливает пункты меню на иконке в трее""" if not menu: menu = [] # Создаем коллекцию не отсортированых элементов. collection = OrderedDict(menu) items = collection.keys() # [имена пунктов] functions = collection.values() # [функции, соотвествующие пунктам] for i, item in enumerate(items): function = functions[i] if isinstance(function, types.MethodType) \ or isinstance(function, types.FunctionType): self.menu.addAction(QtGui.QAction(item, self, triggered=function)) self.quitAction = QtGui.QAction("Exit", self, triggered=QtGui.qApp.quit) self.menu.addAction(self.quitAction) self.setContextMenu(self.menu) def show(icon=None, menu=None): if not isinstance(icon, str) or not icon or not os.path.isfile(icon): raise TypeError, "Parameter 'icon' should be the path to the image" app = QtGui.QApplication(sys.argv) trayIcon = SetTrayIcon(icon, QtGui.QWidget()) if menu and isinstance(menu, list): trayIcon.setMenu(menu) trayIcon.show() sys.exit(app.exec_()) def item1(): print "Call function" def item2(): print "Call function " icon = "/home/zavulon/Programming/Projects/Python2.7/FilesInspector/data" \ "/image/icon.png" menu = [(u"item1", item1), (u"item2", item2)] show(icon, menu) И вот тут мне не понятно: где должен быть основной код приложения, при условии, что он работает в цикле (программа отслеживает изменения файловой системы), если после sys.exit(app.exec_()) никаких действий выполнено быть не может - либо интерфейс замораживается и работает основной код в цикле, либо висит иконка в трее и ничего не происходит? Пробовал через thread, вылазит ошибка.
Ответы
Ответ 1
Кому интересно, вот решение моего вопроса: # -*- coding: utf-8 -*- import time import sys import types from collections import OrderedDict from PyQt4 import QtGui, QtCore class ProgramTray(QtCore.QThread): def __init__(self, icon): QtCore.QThread.__init__(self) self.menu = QtGui.QMenu() self.icon = QtGui.QSystemTrayIcon(QtGui.QIcon(icon)) self.flag_exit = True def run(self): """Код работающий в отдельном потоке""" while self.flag_exit: time.sleep(2) print "I'm working ..." QtGui.QApplication.quit() def stop(self): self.flag_exit = False def setMenu(self, menu=None): """Устанавливает пункты меню по клику на иконку в трее""" if not menu: menu = [] # Создаем коллекцию не отсортированых элементов. collection = OrderedDict(menu) items = collection.keys() # [имена пунктов] functions = collection.values() # [функции. соотвествующие пунктам] for i, item in enumerate(items): function = functions[i] if isinstance(function, types.MethodType) \ or isinstance(function, types.FunctionType): self.menu.addAction(QtGui.QAction(item, self, triggered=function)) self.quitAction = QtGui.QAction("Exit", self, triggered=self.stop) self.menu.addAction(self.quitAction) self.icon.setContextMenu(self.menu) app = QtGui.QApplication(sys.argv) program = ProgramTray( "/home/zavulon/Programming/Projects/Python2.7/FilesInspector/data/" "image/icon.png") program.setMenu() program.icon.show() program.start() app.exec_() Иконка висит в трее, программный код выполняется в отдельном потоке.
Комментариев нет:
Отправить комментарий