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

質問編集履歴

3

追加

2021/03/17 01:02

投稿

person
person

スコア224

title CHANGED
File without changes
body CHANGED
@@ -69,4 +69,65 @@
69
69
 
70
70
  同様の方法では解決できないかもしれません。
71
71
 
72
- 対処方法あったら教えてください。
72
+ 対処方法あったら教えてください。
73
+
74
+ 追記
75
+ ppaul様からの回答をもとに書き換えたら解決
76
+
77
+ ```Python
78
+ import tkinter as tk
79
+
80
+ open_flag = True
81
+
82
+ class MyToplevel:
83
+ def call_open(self, master):
84
+ global open_flag
85
+ if open_flag:
86
+ self.open(master)
87
+
88
+
89
+ def open(self, master):
90
+ global open_flag
91
+ open_flag = False
92
+
93
+ self.master = master
94
+
95
+ self.tl = tk.Toplevel()
96
+ self.tl.wait_visibility()
97
+ self.tl.grab_set()
98
+ self.tl.transient(master)
99
+
100
+ self.l = tk.Label(self.tl, text="This is Toplevel.")
101
+ self.l.grid()
102
+
103
+ self.tl.protocol("WM_DELETE_WINDOW", self.close)
104
+
105
+ def close(self):
106
+ global open_flag
107
+ self.tl.grab_release()
108
+ if isinstance(self.master, tk.Toplevel):
109
+ self.tl.grab_set()
110
+ self.tl.destroy()
111
+ open_flag = True
112
+
113
+
114
+ def push(t, win):
115
+ for i in range(100):
116
+ print(i)
117
+ t.call_open(win)
118
+
119
+
120
+ if __name__ == "__main__":
121
+ t = MyToplevel()
122
+
123
+ win = tk.Tk()
124
+ win.geometry("400x300")
125
+
126
+ button = tk.Button(win, text="click", width=10)
127
+ button.grid()
128
+
129
+ button.bind("<ButtonRelease-1>", lambda e:push(t, win))
130
+
131
+ win.mainloop()
132
+
133
+ ```

2

追加

2021/03/17 01:02

投稿

person
person

スコア224

title CHANGED
File without changes
body CHANGED
@@ -53,7 +53,7 @@
53
53
 
54
54
  grab_set()を使っているので上記のような動作にはならないと思っていたのですが、grab_set()適用前に```MyToplevel.open()```を複数回呼び出しているのでしょうか。
55
55
 
56
- 過去の質問では、
56
+ 過去の質問([Python3 Tkinter Toplevelが重なって表示されてしまいます](https://teratail.com/questions/265823))では、
57
57
  ```
58
58
  t = tk.Toplevel(name="t")
59
59
  ```

1

修正

2021/03/16 08:51

投稿

person
person

スコア224

title CHANGED
File without changes
body CHANGED
@@ -51,7 +51,7 @@
51
51
  期待動作:Toplevelは1個だけ生成する
52
52
  実際の動作:ToplevelはButtonを押した数生成される。n個のToplevelを生成した場合、うち1つのToplevelにn個のウィジェットが全部配置され、ほかのToplevelには何も配置されていない。
53
53
 
54
- grab_set()を使っているので上記のような動作にはならないと思っていたのですが、grab_set()適用前に関数を複数回呼び出しているのでしょうか。
54
+ grab_set()を使っているので上記のような動作にはならないと思っていたのですが、grab_set()適用前に```MyToplevel.open()```を複数回呼び出しているのでしょうか。
55
55
 
56
56
  過去の質問では、
57
57
  ```