创建一个只有一个实例

时间:2018-03-22 13:25:43

标签: wxpython wxwidgets wxpython-phoenix

我想创建一个wxPython应用程序,以便:

  • 如果我运行该应用程序的第二个实例(例如,第二次从shell调用Python脚本),则不应创建新实例。
  • 相反,应该提升并聚焦已经运行的实例的顶层框架。

第一点可以通过wx.SingleInstanceChecker轻松实现(参见那里的示例代码),但至少示例代码只提供了使应用程序的第二个实例中止的方法,但不提高现有应用程序的主框架。

我在Python 3中使用wxPython-Phoenix。

Claritication:我更喜欢像wx.SingleInstanceChecker这样开箱即用的解决方案(也就是说,没有实现我自己的锁定和IPC解决方案)。

2 个答案:

答案 0 :(得分:0)

您可以使用任何类型的IPC发送消息,要求其他程序执行任何需要执行的操作(只需提升其顶级窗口或处理传递给第二个实例的命令行选项)。在C ++中有wxConnection以及可用于此的相关wxServerwxClient类,但我不确定它们是否被wxPython包装 - 但是你可以使用任何Python IPC模块,如果它们不是。

答案 1 :(得分:0)

正如已经指出的那样,执行此操作的“正确”方法是IPC,因为您有一个新流程可能会影响另一个流程中的更改(提升和关注)。

您似乎想要利用wx.SingleInstanceChecker已用于完成工作的IPC渠道。不幸的是,你做不到。该类在wxWidgets c ++代码中实现,因此没有Python绑定到类的内部工作。

但是,您可以滥用wx.SingleInstanceChecker来执行您想要的操作。在您的程序中,您可以设置一个快速间隔(例如250毫秒)的计时器,该计时器将不断检查主进程中的IsAnotherRunning()。因此,当您的第二个进程启动时,第一个进程会注意到并且可以将自己提升到前面。您只需要在退出之前等待辅助流程中的一点,以便第一时间注意。