PyQt阻止应用程序的多个实例弹出相同的对话框

时间:2013-05-01 01:18:06

标签: python qt pyqt

我有一个应用程序,只要有新的RSS提要,就会在所有窗口的前面弹出一个通知对话框。用户可以运行多个应用程序实例,我只想弹出一个通知对话框。有关如何实现这一点的任何想法?感谢。

1 个答案:

答案 0 :(得分:3)

你可以简单地在某个地方放置一个锁定文件来指示另一个进程正在显示一个对话框,并在显示另一个进程之前检查它是否存在。

更复杂的方法是使用QSharedMemory来同步您的访问权限。我在类似的情况下使用上下文管理器做了类似的事情,但对于这种情况,它可能看起来像:

from PyQt4.QtGui import QApplication, QMessageBox
from PyQt4.QtCore import QSharedMemory


class MemoryCondition:
    def __init__(self, key='memory_condition_key'):
        self._shm = QSharedMemory(key)
        if not self._shm.attach():
            if not self._shm.create(1):
                raise RuntimeError('error creating shared memory: %s' %
                                   self._shm.errorString())
        self.condition = False

    def __enter__(self):
        self._shm.lock()
        if self._shm.data()[0] == b'\x00':
            self.condition = True
            self._shm.data()[0] = b'\x01'
        self._shm.unlock()
        return self.condition

    def __exit__(self, exc_type, exc_value, traceback):
        if self.condition:
            self._shm.lock()
            self._shm.data()[0] = b'\x00'
            self._shm.unlock()


# usage example:
app = QApplication([])

with MemoryCondition() as condition:
    if condition:
        mb = QMessageBox()
        mb.setText("you'll only see one of me")
        mb.exec_()
    else:
        print("other process is doing it's stuff")