Есть вот такой код:
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?