質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

python3 tkinterでMac・Windows両方で使える多重起動防止が知りたい

Yuiti628
Yuiti628

総合スコア71

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

2回答

0評価

0クリップ

2279閲覧

投稿2021/07/02 08:03

編集2021/07/02 14:33

#やりたい事
WindowsとMac両方に使える方法で実行ファイルの多重起動を防止させたい。

困っている事

wxPythonではwx.SingleInstanceChecker(self.GetTitle())とかで多重起動を防止できようですが、tkinterで既にGUIは作成してしまいました。
Tkinterでも防止する方法は何があるのでしょうか?

試した事

##fcntlを使った方法

python

import os import fcntl import time def process_lock(): lockfile = os.path.splitext(os.path.abspath(__file__))[0] + '.lock' lockfp = open(lockfile, "w") try: fcntl.flock(lockfp, fcntl.LOCK_EX | fcntl.LOCK_NB) except IOError: return return lockfp def main(): lock = process_lock() if not lock: print("lock error") exit(1) # 処理 time.sleep(360) if __name__ == '__main__': main()

##プロセスの状況をOSなどから監視する

python

# -*- coding: utf-8 -*- from os import path import subprocess # 2重起動を防ぐ file_name = path.basename(__file__) p1 = subprocess.Popen(["ps", "-ef"], stdout=subprocess.PIPE) p2 = subprocess.Popen(["grep", file_name], stdin=p1.stdout, stdout=subprocess.PIPE) p3 = subprocess.Popen(["grep", "python"], stdin=p2.stdout, stdout=subprocess.PIPE) p4 = subprocess.Popen(["wc", "-l"], stdin=p3.stdout, stdout=subprocess.PIPE) p1.stdout.close() p2.stdout.close() p3.stdout.close() output = p4.communicate()[0].decode("utf8").replace('\n','') if int(output) != 1: exit()

threading.Lock()を使用

pythorn

#main ##### #####tkinterにのフォームを作成するクラス ##### if __name__ == "__main__": # 2重起動防止 mutex = threading.Lock() mutex.acquire() # 初期状態の調整 (ファイルの確認など) ff.ConfigFile() root = ThemedTk() app = Application(master=root) app.mainloop() mutex.release()

どちらも上手くいきませんでした、、

一般的にはどのような方法を使うのが普通なのでしょうか?

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

archiver

2021/07/02 15:38 編集

試した方法、それぞれどういった観点で「上手くいかなかった」のでしょうか? (一方はOKでも、他方ではNGとか) 多分、プログラム修正無し(同じコード)でWindowsとMacでプロセス排他をかけたいんですよね?
Yuiti628

2021/07/03 05:58

どの方法でも実行ファイルにして、2回クリックする2個展開されていましす。 エラーとかではないのです、やり方がわからない感じです。 同じコードではなくも大丈夫です。 ただ、Macではfcntl、windowsではロックファイルなど、違う方法はメンテの観点から避けたいところです。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。