teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

SubWindowの実装を別ファイルにした場合の実装例を追記

2019/10/15 01:04

投稿

magichan
magichan

スコア15898

answer CHANGED
@@ -20,4 +20,54 @@
20
20
  button = tk.Button(root, text='SUB_WINDOW', command=create_sub_window)
21
21
  button.pack()
22
22
  root.mainloop()
23
+ ```
24
+
25
+ **【補足】**
26
+
27
+ SubWindowの実装を別ファイルにした場合の実装例
28
+
29
+ __main.py__
30
+ ```Python
31
+ import tkinter as tk
32
+ import sub
33
+
34
+ root = tk.Tk()
35
+
36
+ def callback1(event):
37
+ if event.widget["state"] == "disabled":
38
+ return "break"
39
+ else:
40
+ event.widget["state"] = "disabled":
41
+ # SubWindowを開く
42
+ # 第1引数:SubWindowのowner/第2引数:SubWindowが閉じられたとき呼ばれる関数
43
+ sub.create_sub_window(root, lambda : Button1.config(state='normal'))
44
+
45
+ Button1 = tk.Button(root, text='SUB_WINDOW')
46
+ Button1.pack()
47
+ Button1.bind('<Button-1>', callback1)
48
+ root.mainloop()
49
+ ```
50
+
51
+ __sub.py__
52
+ ```
53
+ import tkinter as tk
54
+
55
+ sub = None
56
+
57
+ def close_sub_window(on_destroy=None):
58
+ global sub
59
+ # 閉じたとき呼ばれる関数が設定されていたらCALLする
60
+ if on_destroy is not None:
61
+ on_destroy()
62
+ # SubWindowを閉じる
63
+ sub.destroy()
64
+ sub = None
65
+
66
+ def create_sub_window(owner, on_destroy=None):
67
+ global sub
68
+ # 既にSubWindowが開いていないかをチェック
69
+ if sub is not None:
70
+ return
71
+ sub = tk.Toplevel(owner)
72
+ sub.protocol('WM_DELETE_WINDOW', lambda: close_sub_window(on_destroy))
23
73
  ```