2012-10-12 35 views
0

我使用鼠用RabbitMQ的服务器如下进行交互: 1. P1信息发送到的RabbitMQ 2. C1是PyQt4的桌面托盘应用程序,这将显示一旦收到上述消息。 的代码如下:我怎样才能传递参数鼠兔回调

import sip 
sip.setapi('QVariant', 2) 

from PyQt4 import QtCore, QtGui 

import systray_rc 


class Window(QtGui.QDialog): 
    def __init__(self): 
     super(Window, self).__init__() 

     self.createIconGroupBox() 
     self.createMessageGroupBox() 

     self.iconLabel.setMinimumWidth(self.durationLabel.sizeHint().width()) 

     self.createActions() 
     self.createTrayIcon() 

     self.showMessageButton.clicked.connect(self.showMessage) 
     self.showIconCheckBox.toggled.connect(self.trayIcon.setVisible) 
     self.iconComboBox.currentIndexChanged.connect(self.setIcon) 
     self.trayIcon.messageClicked.connect(self.messageClicked) 
     self.trayIcon.activated.connect(self.iconActivated) 

     mainLayout = QtGui.QVBoxLayout() 
     mainLayout.addWidget(self.iconGroupBox) 
     mainLayout.addWidget(self.messageGroupBox) 
     self.setLayout(mainLayout) 

     self.iconComboBox.setCurrentIndex(1) 
     self.trayIcon.show() 

     self.setWindowTitle("Systray") 
     self.resize(400, 300)  



    def setVisible(self, visible): 
     self.minimizeAction.setEnabled(visible) 
     self.maximizeAction.setEnabled(not self.isMaximized()) 
     self.restoreAction.setEnabled(self.isMaximized() or not visible) 
     super(Window, self).setVisible(visible) 

    def closeEvent(self, event): 
     if self.trayIcon.isVisible(): 
      QtGui.QMessageBox.information(self, "Systray", 
        "The program will keep running in the system tray. To " 
        "terminate the program, choose <b>Quit</b> in the " 
        "context menu of the system tray entry.") 
      self.hide() 
      event.ignore() 

    def setIcon(self, index): 
     icon = self.iconComboBox.itemIcon(index) 
     self.trayIcon.setIcon(icon) 
     self.setWindowIcon(icon) 

     self.trayIcon.setToolTip(self.iconComboBox.itemText(index)) 

    def iconActivated(self, reason): 
     if reason in (QtGui.QSystemTrayIcon.Trigger, QtGui.QSystemTrayIcon.DoubleClick): 
      self.iconComboBox.setCurrentIndex(
        (self.iconComboBox.currentIndex() + 1) 
        % self.iconComboBox.count()) 
     elif reason == QtGui.QSystemTrayIcon.MiddleClick: 
      self.showMessage() 

    def showMessage(self): 
     icon = QtGui.QSystemTrayIcon.MessageIcon(
       self.typeComboBox.itemData(self.typeComboBox.currentIndex())) 
#  self.trayIcon.showMessage(self.titleEdit.text(), 
#    self.bodyEdit.toPlainText(), icon, 
#    self.durationSpinBox.value() * 1000) 
     self.trayIcon.showMessage('stock alarm', 
       'test', icon, 
       self.durationSpinBox.value() * 1000) 

    def messageClicked(self): 
     QtGui.QMessageBox.information(None, "Systray", 
       "Sorry, I already gave what help I could.\nMaybe you should " 
       "try asking a human?") 

    def createIconGroupBox(self): 
     self.iconGroupBox = QtGui.QGroupBox("Tray Icon") 

     self.iconLabel = QtGui.QLabel("Icon:") 

     self.iconComboBox = QtGui.QComboBox() 
     self.iconComboBox.addItem(QtGui.QIcon(':/images/bad.svg'), "Bad") 
     self.iconComboBox.addItem(QtGui.QIcon(':/images/heart.svg'), "Heart") 
     self.iconComboBox.addItem(QtGui.QIcon(':/images/trash.svg'), "Trash") 

     self.showIconCheckBox = QtGui.QCheckBox("Show icon") 
     self.showIconCheckBox.setChecked(True) 

     iconLayout = QtGui.QHBoxLayout() 
     iconLayout.addWidget(self.iconLabel) 
     iconLayout.addWidget(self.iconComboBox) 
     iconLayout.addStretch() 
     iconLayout.addWidget(self.showIconCheckBox) 
     self.iconGroupBox.setLayout(iconLayout) 

    def createMessageGroupBox(self): 
     self.messageGroupBox = QtGui.QGroupBox("Balloon Message") 

     typeLabel = QtGui.QLabel("Type:") 

     self.typeComboBox = QtGui.QComboBox() 
     self.typeComboBox.addItem("None", QtGui.QSystemTrayIcon.NoIcon) 
     self.typeComboBox.addItem(self.style().standardIcon(
       QtGui.QStyle.SP_MessageBoxInformation), "Information", 
       QtGui.QSystemTrayIcon.Information) 
     self.typeComboBox.addItem(self.style().standardIcon(
       QtGui.QStyle.SP_MessageBoxWarning), "Warning", 
       QtGui.QSystemTrayIcon.Warning) 
     self.typeComboBox.addItem(self.style().standardIcon(
       QtGui.QStyle.SP_MessageBoxCritical), "Critical", 
       QtGui.QSystemTrayIcon.Critical) 
     self.typeComboBox.setCurrentIndex(1) 

     self.durationLabel = QtGui.QLabel("Duration:") 

     self.durationSpinBox = QtGui.QSpinBox() 
     self.durationSpinBox.setRange(5, 60) 
     self.durationSpinBox.setSuffix(" s") 
     self.durationSpinBox.setValue(15) 

     durationWarningLabel = QtGui.QLabel("(some systems might ignore this " 
       "hint)") 
     durationWarningLabel.setIndent(10) 

     titleLabel = QtGui.QLabel("Title:") 

     self.titleEdit = QtGui.QLineEdit("Cannot connect to network") 

     bodyLabel = QtGui.QLabel("Body:") 

     self.bodyEdit = QtGui.QTextEdit() 
     self.bodyEdit.setPlainText("Don't believe me. Honestly, I don't have " 
       "a clue.\nClick this balloon for details.") 

     self.showMessageButton = QtGui.QPushButton("Show Message") 
     self.showMessageButton.setDefault(True) 

     messageLayout = QtGui.QGridLayout() 
     messageLayout.addWidget(typeLabel, 0, 0) 
     messageLayout.addWidget(self.typeComboBox, 0, 1, 1, 2) 
     messageLayout.addWidget(self.durationLabel, 1, 0) 
     messageLayout.addWidget(self.durationSpinBox, 1, 1) 
     messageLayout.addWidget(durationWarningLabel, 1, 2, 1, 3) 
     messageLayout.addWidget(titleLabel, 2, 0) 
     messageLayout.addWidget(self.titleEdit, 2, 1, 1, 4) 
     messageLayout.addWidget(bodyLabel, 3, 0) 
     messageLayout.addWidget(self.bodyEdit, 3, 1, 2, 4) 
     messageLayout.addWidget(self.showMessageButton, 5, 4) 
     messageLayout.setColumnStretch(3, 1) 
     messageLayout.setRowStretch(4, 1) 
     self.messageGroupBox.setLayout(messageLayout) 

    def createActions(self): 
     self.minimizeAction = QtGui.QAction("Mi&nimize", self, 
       triggered=self.hide) 

     self.maximizeAction = QtGui.QAction("Ma&ximize", self, 
       triggered=self.showMaximized) 

     self.restoreAction = QtGui.QAction("&Restore", self, 
       triggered=self.showNormal) 

     self.quitAction = QtGui.QAction("&Quit", self, 
       triggered=QtGui.qApp.quit) 

    def createTrayIcon(self): 
     self.trayIconMenu = QtGui.QMenu(self) 
     self.trayIconMenu.addAction(self.minimizeAction) 
     self.trayIconMenu.addAction(self.maximizeAction) 
     self.trayIconMenu.addAction(self.restoreAction) 
     self.trayIconMenu.addSeparator() 
     self.trayIconMenu.addAction(self.quitAction) 

     self.trayIcon = QtGui.QSystemTrayIcon(self) 
     self.trayIcon.setContextMenu(self.trayIconMenu) 

def callback(ch, method, properties, body): 
     print " [x] %r:%r" % (method.routing_key, body,) 
     #window.showMessage = body 
     #window.showMessage() 
     #self.showMessage() 

def subsribeRabbit(): 
    import pika 
    import sys 
    from util import settings 

    connection = pika.BlockingConnection(pika.ConnectionParameters(
      host=settings.RABBIT_SERVER)) 
    channel = connection.channel() 

    channel.exchange_declare(exchange=settings.STOCK_ALARMS_TOPIC, 
          type='topic') 

    result = channel.queue_declare(exclusive=True) 
    queue_name = result.method.queue 

    binding_keys = '#' 

    for binding_key in binding_keys: 
     channel.queue_bind(exchange=settings.STOCK_ALARMS_TOPIC, 
          queue=queue_name, 
          routing_key=binding_key) 

    print ' [*] Waiting for logs. To exit press CTRL+C' 


    channel.basic_consume(callback, 
          queue=queue_name, 
          no_ack=True) 

    channel.start_consuming() 

if __name__ == '__main__': 

    import sys 
    from cron.realtimemonitorschedule import startMonitor  

    app = QtGui.QApplication(sys.argv) 

    if not QtGui.QSystemTrayIcon.isSystemTrayAvailable(): 
     QtGui.QMessageBox.critical(None, "Systray", 
       "I couldn't detect any system tray on this system.") 
     sys.exit(1) 

    QtGui.QApplication.setQuitOnLastWindowClosed(False) 

    window = Window() 
    window.show() 
    from threading import Thread 
    thread = Thread(target = subsribeRabbit) 
    thread.start() 
    #thread.join() 

    sys.exit(app.exec_()) 

的问题是,我怎么可能事先打电话window.showMessage回调()函数谢谢,我是新来的Python和RabbitMQ的?

+0

请将您的代码修剪到重现问题所需的最小值。就像现在一样,人们很难理解你的问题并帮助你。 – 2012-10-12 08:55:51

回答

0

诀窍是用于全局变量定义窗口如下:

import sip 
sip.setapi('QVariant', 2) 

from PyQt4 import QtCore, QtGui 

import systray_rc 

window = Window() 
window.show() 

class Window(QtGui.QDialog): 
    def __init__(self): 
     super(Window, self).__init__() 

     self.createIconGroupBox() 
     self.createMessageGroupBox() 

     self.iconLabel.setMinimumWidth(self.durationLabel.sizeHint().width()) 

     self.createActions() 
     self.createTrayIcon() 

     self.showMessageButton.clicked.connect(self.showMessage) 
     self.showIconCheckBox.toggled.connect(self.trayIcon.setVisible) 
     self.iconComboBox.currentIndexChanged.connect(self.setIcon) 
     self.trayIcon.messageClicked.connect(self.messageClicked) 
     self.trayIcon.activated.connect(self.iconActivated) 

     mainLayout = QtGui.QVBoxLayout() 
     mainLayout.addWidget(self.iconGroupBox) 
     mainLayout.addWidget(self.messageGroupBox) 
     self.setLayout(mainLayout) 

     self.iconComboBox.setCurrentIndex(1) 
     self.trayIcon.show() 

     self.setWindowTitle("Systray") 
     self.resize(400, 300)  



    def setVisible(self, visible): 
     self.minimizeAction.setEnabled(visible) 
     self.maximizeAction.setEnabled(not self.isMaximized()) 
     self.restoreAction.setEnabled(self.isMaximized() or not visible) 
     super(Window, self).setVisible(visible) 

    def closeEvent(self, event): 
     if self.trayIcon.isVisible(): 
      QtGui.QMessageBox.information(self, "Systray", 
        "The program will keep running in the system tray. To " 
        "terminate the program, choose <b>Quit</b> in the " 
        "context menu of the system tray entry.") 
      self.hide() 
      event.ignore() 

    def setIcon(self, index): 
     icon = self.iconComboBox.itemIcon(index) 
     self.trayIcon.setIcon(icon) 
     self.setWindowIcon(icon) 

     self.trayIcon.setToolTip(self.iconComboBox.itemText(index)) 

    def iconActivated(self, reason): 
     if reason in (QtGui.QSystemTrayIcon.Trigger, QtGui.QSystemTrayIcon.DoubleClick): 
      self.iconComboBox.setCurrentIndex(
        (self.iconComboBox.currentIndex() + 1) 
        % self.iconComboBox.count()) 
     elif reason == QtGui.QSystemTrayIcon.MiddleClick: 
      self.showMessage() 

    def showMessage(self,text='test'): 
     icon = QtGui.QSystemTrayIcon.MessageIcon(
       self.typeComboBox.itemData(self.typeComboBox.currentIndex())) 
#  self.trayIcon.showMessage(self.titleEdit.text(), 
#    self.bodyEdit.toPlainText(), icon, 
#    self.durationSpinBox.value() * 1000) 
     self.trayIcon.showMessage('stock alarm', 
       'test', icon, 
       self.durationSpinBox.value() * 1000) 

    def messageClicked(self): 
     QtGui.QMessageBox.information(None, "Systray", 
       "Sorry, I already gave what help I could.\nMaybe you should " 
       "try asking a human?") 

    def createIconGroupBox(self): 
     self.iconGroupBox = QtGui.QGroupBox("Tray Icon") 

     self.iconLabel = QtGui.QLabel("Icon:") 

     self.iconComboBox = QtGui.QComboBox() 
     self.iconComboBox.addItem(QtGui.QIcon(':/images/bad.svg'), "Bad") 
     self.iconComboBox.addItem(QtGui.QIcon(':/images/heart.svg'), "Heart") 
     self.iconComboBox.addItem(QtGui.QIcon(':/images/trash.svg'), "Trash") 

     self.showIconCheckBox = QtGui.QCheckBox("Show icon") 
     self.showIconCheckBox.setChecked(True) 

     iconLayout = QtGui.QHBoxLayout() 
     iconLayout.addWidget(self.iconLabel) 
     iconLayout.addWidget(self.iconComboBox) 
     iconLayout.addStretch() 
     iconLayout.addWidget(self.showIconCheckBox) 
     self.iconGroupBox.setLayout(iconLayout) 

    def createMessageGroupBox(self): 
     self.messageGroupBox = QtGui.QGroupBox("Balloon Message") 

     typeLabel = QtGui.QLabel("Type:") 

     self.typeComboBox = QtGui.QComboBox() 
     self.typeComboBox.addItem("None", QtGui.QSystemTrayIcon.NoIcon) 
     self.typeComboBox.addItem(self.style().standardIcon(
       QtGui.QStyle.SP_MessageBoxInformation), "Information", 
       QtGui.QSystemTrayIcon.Information) 
     self.typeComboBox.addItem(self.style().standardIcon(
       QtGui.QStyle.SP_MessageBoxWarning), "Warning", 
       QtGui.QSystemTrayIcon.Warning) 
     self.typeComboBox.addItem(self.style().standardIcon(
       QtGui.QStyle.SP_MessageBoxCritical), "Critical", 
       QtGui.QSystemTrayIcon.Critical) 
     self.typeComboBox.setCurrentIndex(1) 

     self.durationLabel = QtGui.QLabel("Duration:") 

     self.durationSpinBox = QtGui.QSpinBox() 
     self.durationSpinBox.setRange(5, 60) 
     self.durationSpinBox.setSuffix(" s") 
     self.durationSpinBox.setValue(15) 

     durationWarningLabel = QtGui.QLabel("(some systems might ignore this " 
       "hint)") 
     durationWarningLabel.setIndent(10) 

     titleLabel = QtGui.QLabel("Title:") 

     self.titleEdit = QtGui.QLineEdit("Cannot connect to network") 

     bodyLabel = QtGui.QLabel("Body:") 

     self.bodyEdit = QtGui.QTextEdit() 
     self.bodyEdit.setPlainText("Don't believe me. Honestly, I don't have " 
       "a clue.\nClick this balloon for details.") 

     self.showMessageButton = QtGui.QPushButton("Show Message") 
     self.showMessageButton.setDefault(True) 

     messageLayout = QtGui.QGridLayout() 
     messageLayout.addWidget(typeLabel, 0, 0) 
     messageLayout.addWidget(self.typeComboBox, 0, 1, 1, 2) 
     messageLayout.addWidget(self.durationLabel, 1, 0) 
     messageLayout.addWidget(self.durationSpinBox, 1, 1) 
     messageLayout.addWidget(durationWarningLabel, 1, 2, 1, 3) 
     messageLayout.addWidget(titleLabel, 2, 0) 
     messageLayout.addWidget(self.titleEdit, 2, 1, 1, 4) 
     messageLayout.addWidget(bodyLabel, 3, 0) 
     messageLayout.addWidget(self.bodyEdit, 3, 1, 2, 4) 
     messageLayout.addWidget(self.showMessageButton, 5, 4) 
     messageLayout.setColumnStretch(3, 1) 
     messageLayout.setRowStretch(4, 1) 
     self.messageGroupBox.setLayout(messageLayout) 

    def createActions(self): 
     self.minimizeAction = QtGui.QAction("Mi&nimize", self, 
       triggered=self.hide) 

     self.maximizeAction = QtGui.QAction("Ma&ximize", self, 
       triggered=self.showMaximized) 

     self.restoreAction = QtGui.QAction("&Restore", self, 
       triggered=self.showNormal) 

     self.quitAction = QtGui.QAction("&Quit", self, 
       triggered=QtGui.qApp.quit) 

    def createTrayIcon(self): 
     self.trayIconMenu = QtGui.QMenu(self) 
     self.trayIconMenu.addAction(self.minimizeAction) 
     self.trayIconMenu.addAction(self.maximizeAction) 
     self.trayIconMenu.addAction(self.restoreAction) 
     self.trayIconMenu.addSeparator() 
     self.trayIconMenu.addAction(self.quitAction) 

     self.trayIcon = QtGui.QSystemTrayIcon(self) 
     self.trayIcon.setContextMenu(self.trayIconMenu) 

def callback(ch, method, properties, body): 
     print " [x] %r:%r" % (method.routing_key, body,) 
     window.showMessage(body) 


def subsribeRabbit(): 
    import pika 
    import sys 
    from util import settings 

    connection = pika.BlockingConnection(pika.ConnectionParameters(
      host=settings.RABBIT_SERVER)) 
    channel = connection.channel() 

    channel.exchange_declare(exchange=settings.STOCK_ALARMS_TOPIC, 
          type='topic') 

    result = channel.queue_declare(exclusive=True) 
    queue_name = result.method.queue 

    binding_keys = '#' 

    for binding_key in binding_keys: 
     channel.queue_bind(exchange=settings.STOCK_ALARMS_TOPIC, 
          queue=queue_name, 
          routing_key=binding_key) 

    print ' [*] Waiting for logs. To exit press CTRL+C' 


    channel.basic_consume(callback, 
          queue=queue_name, 
          no_ack=True) 

    channel.start_consuming() 

if __name__ == '__main__': 

    import sys 
    from cron.realtimemonitorschedule import startMonitor  

    app = QtGui.QApplication(sys.argv) 

    if not QtGui.QSystemTrayIcon.isSystemTrayAvailable(): 
     QtGui.QMessageBox.critical(None, "Systray", 
       "I couldn't detect any system tray on this system.") 
     sys.exit(1) 

    QtGui.QApplication.setQuitOnLastWindowClosed(False) 


    from threading import Thread 
    thread = Thread(target = subsribeRabbit) 
    thread.start() 
    #thread.join() 

    sys.exit(app.exec_()) 
1

声明一个类的实例,然后再通过类方法,如鼠兔consumer_callback:

callback = classObject(additional_paramters) 

channel.basic_consume(callback.method, 
         queue=queue_name, 
         no_ack=True) 

也许?

相关问题