【问题标题】:Create a wxPython app that has only one instance创建一个只有一个实例的 wxPython 应用程序
【发布时间】:2018-08-31 23:08:03
【问题描述】:

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

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

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

我在 Python 3 中使用 wxPython-Phoenix。

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

【问题讨论】:

    标签: wxwidgets wxpython


    【解决方案1】:

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

    【讨论】:

    • 是的,可以。但我宁愿不必从头开始实现它......
    【解决方案2】:

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

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

    然而,你可能会滥用 wx.SingleInstanceChecker 来做你想做的事。在您的程序中,您可以在某个快速间隔(例如 250 毫秒)设置一个计时器,该计时器将不断检查您的主进程中的 IsAnotherRunning()。因此,当您的第二个进程启动时,第一个进程会注意到并可以将自己提升到前面。您只需要在辅助进程中稍等片刻即可退出,以便第一时间注意到。

    【讨论】:

      猜你喜欢
      • 2022-10-24
      • 2012-10-30
      • 1970-01-01
      • 2020-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      相关资源
      最近更新 更多