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

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

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

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

Tkinter

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

Python

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

Q&A

解決済

1回答

2400閲覧

Python Tkinterで多重起動防止するときに発生するエラーの原因・解決方法が知りたい。

a.sato-imo_66

総合スコア2

Windows

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

Tkinter

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

Python

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

0グッド

0クリップ

投稿2021/10/01 12:17

前提・実現したいこと

TkinterでGUIを作成しています。
tkウィンドウ表示中にもう一度実行を押してしまうと応答なしになってしまいます。
それを防ぐため、”Help"というtkウィンドウが既に開かれていたら、
処理を終了するコードを作成しました。
作成したコードで、多重起動防止はできるのですが、
tkウィンドウを閉じた際にエラーが出てしまいます。
このエラーの原因・解決方法を知りたいです。
ご回答お願い致します。

発生している問題・エラーメッセージ

以下エラーメッセージ(パス省略)

Traceback (most recent call last):
File "C:~\intpyapp.py",line345, in OnFileRun
scriptutils.RunScript(None, None, showDlg)
File "C:~\scriptutils.py",line353, in RunScript
del_main_._file_
AttributeError:_file_

該当のソースコード

# -*- coding: utf8 -*- import Tkinter as tk import sys from win32gui import EnumWindows,GetWindowText def EnumWindowsProc(hwnd,title): name = GetWindowText(hwnd) if name.find(title) >= 0: sys.exit(-1) EnumWindows(EnumWindowsProc,"Help") root = tk.Tk() root.title("Help") root.mainloop()

試したこと

エラー内容を調べてみましたが、解決方法が分かりませんでした。

補足情報(FW/ツールのバージョンなど)

・python2.7
・windows10

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

teamikl

2021/10/04 03:39

どのような環境で実行してますか?(エディタやIDE から実行、コマンドプロンプトで実行等) 端末での実行ではエラーを確認できませんでした。 他のコードを実行して、同じエラーが出るかどうかを試してみてください。 エラーコードは、記載のコードのものではなく、 実行環境が出したもののようなので、問題解決には実行環境の情報が必要です。
a.sato-imo_66

2021/10/04 06:15

環境はPythonWinです。 他のコードでは、エラーは出ません。 多重起動防止した後、tkウィンドウを閉じた場合のみこのエラーが出ます。
teamikl

2021/10/04 07:16

実行環境の方が多重起動に対応してないように思います。 他のコードは多重起動を確認できるものですか? 例えば、多重起動防止処理はなしにして、 (EnumWindows(EnumWindowsProc,"Help")の行をコメントアウト) ウィンドウを出すだけのプログラムを2回実行して どちらかのウィンドウを閉じるで同じ問題が再現しませんか?
guest

回答1

0

ベストアンサー

恐らく、実行環境の方が多重起動に対応していません。

質問に掲載のコードに関しては、(他のウィンドウの"Help"で誤検出する点を除き)問題ありません。

詳細: OnFileRun, RunScript を追ってみたところ
https://github.com/mhammond/pywin32/blob/main/Pythonwin/pywin/framework/intpyapp.py
https://github.com/mhammond/pywin32/blob/main/Pythonwin/pywin/framework/scriptutils.py

exec文でコードを実行している為、同プロセス内での実行となります。
一回目の実行と二回目の実行時のメモリ空間を共有してる為、

  • 一回目の実行
  • 二回目の実行 ここで一回目の実行時の情報を上書き
  • 多重起動防止で二回目の実行が終了・後始末の処理
  • ウィンドウを閉じ一回目の実行が終了・後始末の処理でエラー

後始末の具体的な部分は、del_main_._file_

2回目の実行が多重起動防止により終了した時に __main__.__file__ 情報が削除されるため、
その後1回目の実行ででたウィンドウを閉じて、再度、実行後の後始末をしようとした時に、
想定された情報が無い為エラーとなってる様です。

execでのコードを実行するタイプは、簡易的なコードの実行には便利ですが、
GUIアプリケーションのデバッグには向かない為、他の IDE の利用をお勧めします。

投稿2021/10/04 07:26

編集2021/10/04 07:30
teamikl

総合スコア8760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

a.sato-imo_66

2021/10/04 11:02

丁寧な解説ありがたいです。 まさか、環境の問題だったとは… ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問