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 # Пользовательсеий код работающий в отдельном потоке в трее. self.code = None def run(self): if isinstance(self.code, types.MethodType) \ or isinstance(self.code, types.FunctionType): self.code() else: QtGui.QApplication.quit() raise TypeError, "Parameter code has to be a function or class " \ "method" 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) if __name__ == "__main__": import time def yourCode(): while programTray.flag_exit: time.sleep(1) print "Work your code ..." QtGui.QApplication.quit() app = QtGui.QApplication(sys.argv) programTray = ProgramTray("./icon.png") programTray.code = yourCode programTray.setMenu() programTray.icon.show() programTray.start() app.exec_()
Подскажите, как я могу вызывать диалоговые окна QtGui.QMessageBox.Information, QtGui.QMessageBox.Critical, QtGui.QMessageBox.Question, QtGui.QMessageBox.Warning и QtGui.QFileDialog.Options в функции yourCode?