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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

6295閲覧

ライブラリのeelを使用して、pythonを実行するが、設定したclose_callbackが反応しない。

Githum

総合スコア18

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/02/06 20:52

編集2021/02/06 20:54

前提・実現したいこと

# 実行環境 python 3.7.3 eel 0.14.0

eelで開いたchromeウィンドウを閉じたときにprint('end')を出力し、pythonアプリも終了したい

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

pythonアプリを実行すると正常にeelが実行され、htmlが問題なく表示される。
しかし表示されているchromeウィンドウを閉じた時、本来は設定したclose_callbackの実行になるはずが、無反応。
print('end')も出力されず、メインのPythonアプリも終了しない。
上記の状態で、再度pythonアプリを実行すると下記エラーMSGが表示されたあと、chromeウィンドウにてhtmlが表示される。

Traceback (most recent call last): File "cathand.py", line 75, in <module> EelDefort("1280","720","main.html").eel_start_window() File "cathand.py", line 70, in eel_start_window eel.start(self.html,size=eel_size,options=eel_options,suppress_error=True) File "/home/user/.local/lib/python3.7/site-packages/eel/__init__.py", line 180, in start run_lambda() File "/home/user/.local/lib/python3.7/site-packages/eel/__init__.py", line 176, in run_lambda app=app) File "/home/user/.local/lib/python3.7/site-packages/bottle.py", line 3137, in run server.run(app) File "/home/user/.local/lib/python3.7/site-packages/bottle_websocket/server.py", line 17, in run server.serve_forever() File "/home/user/.local/lib/python3.7/site-packages/gevent/baseserver.py", line 398, in serve_forever self.start() File "/home/user/.local/lib/python3.7/site-packages/gevent/baseserver.py", line 336, in start self.init_socket() File "/home/user/.local/lib/python3.7/site-packages/gevent/pywsgi.py", line 1545, in init_socket StreamServer.init_socket(self) File "/home/user/.local/lib/python3.7/site-packages/gevent/server.py", line 180, in init_socket self.socket = self.get_listener(self.address, self.backlog, self.family) File "/home/user/.local/lib/python3.7/site-packages/gevent/server.py", line 192, in get_listener return _tcp_listener(address, backlog=backlog, reuse_addr=cls.reuse_addr, family=family) File "/home/user/.local/lib/python3.7/site-packages/gevent/server.py", line 288, in _tcp_listener sock.bind(address) File "/home/user/.local/lib/python3.7/site-packages/gevent/_socketcommon.py", line 563, in bind return self._sock.bind(address) OSError: [Errno 98] Address already in use: ('localhost', 8080)

該当のソースコード

ディレクトリ構造は下記となっている

~/python/main.py ~/python/web/main.html

main.pyのコードは下記となっている

python

1#! /usr/bin/env python 2# -*- coding: utf-8 -*- 3import eel 4import sys 5 6def close_window(arg1, arg2): 7 print('end') 8 sys.exit(0) 9 10class EelDefort: 11 def __init__(self,html): 12 self.html = html 13 def eel_start_window(self): 14 eel.init("web") 15 eel_options = { 16 "mode": "chrome", 17 "port": 8080, 18 "close_callback": close_window 19 } 20 eel.start(self.html,options=eel_options,suppress_error=True) 21 22if __name__ == "__main__": 23 EelDefort("main.html").eel_start_window()

main.htmlのコードは下記となっている

html

1<html> 2 <head> 3 <meta charset="UTF-8"> 4 <title>Eel</title> 5 </head> 6 <body> 7 Hello World!! 8 </body> 9</html>

試したこと

①eel_optionsの"close_callback"を削除し、下記コードに変更するが、変化なし

Before

1〜省略〜 2 3eel.start(self.html,options=eel_options,suppress_error=True) 4 5〜省略〜

After

1〜省略〜 2 3eel.start(self.html,close_callback=close_window,options=eel_options,suppress_error=True) 4 5〜省略〜

②close_callback実行中に検出されたエラーを出力するために下記コードへ変更するが、エラー表示されず、変化なし

Before

1〜省略〜 2 3if __name__ == "__main__": 4 EelDefort("main.html").eel_start_window()

After

1〜省略〜 2 3if __name__ == "__main__": 4 try: 5 EelDefort("main.html").eel_start_window() 6 except: 7 print('Error')

③python 2.7.16 {eel >> 0.12.4} で実行しても変化なし

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

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

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

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

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

guest

回答1

0

ベストアンサー

GitHubのEelのREADME.mdに以下のような記載があります。

You should include this in any pages:

<script type="text/javascript" src="/eel.js"></script>

Including this library creates an eel object which can be used to communicate with the Python side.

つまりPython側と通信するためにどのページにも/eel.jsを読み込むべきと記載があります。
(これがないとウインドウを閉じたことが検知されない。)

そのためmain.html

html

1<html> 2 <head> 3 <meta charset="UTF-8"> 4 <title>Eel</title> 5 </head> 6 <body> 7 Hello World!! 8 </body> 9</html>

下記のように修正すれば解決すると思います。

html

1<html> 2 <head> 3 <meta charset="UTF-8"> 4 <script type="text/javascript" src="/eel.js"></script> 5 <title>Eel</title> 6 </head> 7 <body> 8 Hello World!! 9 </body> 10</html>

投稿2021/02/06 22:03

errormaker74

総合スコア230

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

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

Githum

2021/02/07 02:17

先程回答通りに修正して試したところ、無事close_callbackが実行されました!ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問