リンク

2017年6月27日火曜日

wxPythonでアプリの多重起動を防止する

様々なアプリケーションを作成していく中で、「同じアプリケーションが同時に実行されては困る」場合があります。

今回はwxPythonで複数起動しないように制御する方法をご紹介します。

環境
  • macOS Sierra 10.12.5
  • python 3.4
  • wxPython Phoenix 4.0.0


それでは早速スクリプトです。
# -*- coding: UTF-8 -*-

import wx

class App(wx.Frame):
    """ GUI """
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(300, 300), style=wx.DEFAULT_FRAME_STYLE)

        # 二重起動の防止
        self.instance = wx.SingleInstanceChecker(self.GetTitle())

        if self.instance.IsAnotherRunning():
            dialog = wx.MessageDialog(None, '%sはすでに起動中です。' % self.GetTitle(), 'エラー', wx.ICON_ERROR)
            dialog.ShowModal()
            dialog.Destroy()
            wx.Exit()

        self.Show()


app = wx.App()
App(None, wx.ID_ANY, 'sample')
app.MainLoop()

<結果> ↓ ↓ ↓


解説
多重起動(二重起動)を防止するためにはSingleInstanceCheckerクラスを使用します。

SingleInstanceCheckerクラスはIsAnotherRunningメソッドを使うことで、引数に与えたものが既に実行中であるかどうかを判別することができるというものです。
すでに実行中である場合、IsAnotherRunning関数はTrueを返します。

今回はアプリケーションのタイトルを取得し、同じ名前のアプリケーションが起動しているかどうかをチェックしています。

タイトルだけを選別対象としていますので、例えば全く別のexeファイルと同じタイトルにして上記を実行すると、「すでに起動中」のメッセージが表示されることになります。

まとめ
個人的には、アプリケーションの多重起動は推奨しません。
多重起動によるメリットよりもデメリットの方が多いと考えられるからです。
(設定ファイルへの同時アクセスとか)
なので私はアプリケーションを作る際に使用するテンプレートの中に上記の内容を含んでいます。

すでに作成済みのアプリケーションに対してもほんの数行追加するだけですので、ぜひ導入してみてはいかがでしょうか。

参考
https://wxpython.org/Phoenix/docs/html/wx.SingleInstanceChecker.html

0 件のコメント:

コメントを投稿