TkEasyGUIの不具合のような感じがするので、(実際不具合かどうかはおいといて)GitHubのissuesで尋ねた方がいい気がします。
https://github.com/kujirahand/tkeasygui-python/issues
ちょっと見てみました。
以下の最小コードでも発生しますね。
python
1import TkEasyGUI as eg
2
3layout = [
4 [eg.Button('Hoge')],
5 [eg.Button('Piyo')],
6]
7
8with eg.Window('Hello', layout) as window:
9 for event, values in window.event_iter():
10 if event == 'Hoge':
11 eg.dialogs.popup_buttons('Hello')
12 elif event == 'Piyo':
13 eg.dialogs.popup_get_date('Hello')
14
ソースコードも見てみました。
以下は、 TkEasyGUI/widgets.py
の中から抜粋です。
python
1class Window:
2 def __init__(
3 self,
4 title: str,
5 layout: list[list[Element]], # set elements layout
6 size: Union[tuple[str, int], None] = None, # window size
7 resizable: bool = False,
8 font: Union[FontType, None] = None,
9 modal: bool = False, # modal window
10 keep_on_top: bool = False, # keep on top
11 no_titlebar: bool = False, # hide titlebar
12 grab_anywhere: bool = False, # can move window by dragging anywhere
13 alpha_channel: float = 1.0, # window alpha channel
14 enable_key_events: bool = False, # enable keyboard events
15 return_keyboard_events: bool = False, # enable keyboard events (for compatibility)
16 location: Union[tuple[int, int], None] = None, # window location
17 center_window: bool = True, # move window to center
18 row_padding: int = 2, # row padding
19 padding_x: int = 8, # x padding around the window
20 padding_y: int = 8, # y padding around the window
21 icon: Union[str, None] = None, # window icon, specify filename (Experimental)
22 show_scrollbar: bool = False, # show scrollbar (Experimental)
23 **kw,
24 ) -> None:
25 # 省略
26 self.window.protocol("WM_DELETE_WINDOW", lambda : self._close_handler())
27 # 省略
28
29 def _close_handler(self):
30 """Handle a window close event."""
31 self.flag_alive = False
32 if self.timeout_id is not None:
33 self.window.after_cancel(self.timeout_id)
34 self._event_handler(WINDOW_CLOSED, None)
35
36 def close(self) -> None:
37 """Close the window."""
38 # The phenomenon where a closed window remains visible is occurring, so forcibly making it transparent.
39 try:
40 self.set_alpha_channel(0.0) # force hide
41 except Exception as _:
42 pass
43 try:
44 self.hide()
45 except Exception as _:
46 pass
47 # already closed?
48 if not self.flag_alive:
49 return
50 # close window
51 try:
52 self.flag_alive = False
53 _window_pop(self)
54 self.window.destroy() # close window
55 win_count = _window_count()
56 if win_count == 0:
57 self.window.quit() # quit app
58 except Exception as e:
59 print(f"Window.close.failed: {e}", file=sys.stderr)
60 pass
61
ざっと見たところ、ウィンドウクローズイベントで flag_alive
を False
にして、その場合には close
メソッドの中で一部処理を省いているようです。
ただ、自分もTkinterはよく知らないのですが、ググってみると、
上記のサイトなど参考にすると、
例えば終了ボタンでウィンドウが閉じられる場合は、WM_DELETE_WINDOW という名前のイベントが発生します。
通常はこのイベントが発生すると、destroy メソッドが実行されてアプリが終了しますが、protocol メソッドを利用すると、その処理を横取りして他の処理に置き換えることができます。
などと書かれており、イベントをハンドリングしているせいでウィンドウの破棄が行われず、 close
メソッドの中でも destroy
メソッドを呼ばす、結局の所ウィンドウが残って入力をハンドリングし続けているのでは?という感じもします。
まぁ先も言ったとおり自分はTkinterを知らないので正しいかどうかはわかりませんが、もしGitHubのissuesに書き込むのであれば、その辺りを突っつくか、なんでしたらこの質問のURLを貼り付けてもいいと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/09/17 00:54