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

質問編集履歴

2

追加

2021/01/18 05:41

投稿

person
person

スコア224

title CHANGED
File without changes
body CHANGED
@@ -145,7 +145,7 @@
145
145
  class Sub(tk.Toplevel):
146
146
  """
147
147
  継承先クラス Sub のコンストラクタ __init__() の定義が無いと、
148
- 継承元クラス Toplevel のコンストラクタ __init__() が呼ばれる。
148
+ Sub() インスタンス生成時に継承元クラス Toplevel のコンストラクタ __init__() が呼ばれる。
149
149
  Sub() インスタンス生成時に継承元のコンストラクタが呼ばれると困るので、
150
150
  コンストラクタ(処理としては「何もしない」)を定義する。
151
151
 

1

追加

2021/01/18 05:41

投稿

person
person

スコア224

title CHANGED
File without changes
body CHANGED
@@ -79,4 +79,102 @@
79
79
 
80
80
  if __name__ == "__main__":
81
81
  main()
82
+ ```
83
+
84
+ # 追記
85
+ teamikl様より修正して意図した結果になったソースコード
86
+ ```Python:
87
+ from tkinter import ttk
88
+ import tkinter as tk
89
+
90
+ class Main(tk.Tk):
91
+ def __init__(self):
92
+ super().__init__()
93
+ self.sub = Sub()
94
+ self.geometry("400x300+0+0")
95
+ self.title("main")
96
+ self.sub.open(self) # ← 書かなくてもToplevelウィンドウが表示される(?)
97
+
98
+ class Sub(tk.Toplevel):
99
+ def open(self, master):
100
+ self.geometry("200x200+25+25")
101
+ self.title("sub")
102
+ self.attributes("-topmost", True)
103
+ self.grab_set()
104
+ self.transient(master)
105
+ self.protocol("WM_DELETE_WINDOW", self.close)
106
+
107
+ def close(self):
108
+ self.grab_release()
109
+ self.destroy()
110
+
111
+ def main():
112
+ app = Main()
113
+ app.mainloop()
114
+
115
+ if __name__ == "__main__":
116
+ main()
117
+ ```
118
+
119
+ ボタン押下でToplevelを開くように個人的に変えたプログラム
120
+ ```Python:
121
+ from tkinter import ttk
122
+ import tkinter as tk
123
+
124
+ """
125
+ Frame を継承するのが一般的(?)だが、
126
+ Frame を生成・配置する必要はないので、Tk を継承する
127
+ """
128
+ class Main(tk.Tk):
129
+ def __init__(self):
130
+ # Tk のコンストラクタ呼び出し
131
+ super().__init__()
132
+ # Sub のインスタンス生成(ここではToplevelウィンドウは表示しない)
133
+ self.sub = Sub()
134
+ # Tk の設定
135
+ self.geometry("400x300+0+0")
136
+ self.title("main")
137
+ # Tk にウィジェット配置
138
+ self.button = ttk.Button(self, text="open", command=self.pushed)
139
+ self.button.grid()
140
+
141
+ def pushed(self):
142
+ # open 呼び出しにより、Toplevelウィンドウを生成
143
+ self.sub.open(self)
144
+
145
+ class Sub(tk.Toplevel):
146
+ """
147
+ 継承先クラス Sub のコンストラクタ __init__() の定義が無いと、
148
+ 継承元クラス Toplevel のコンストラクタ __init__() が呼ばれる。
149
+ Sub() インスタンス生成時に継承元のコンストラクタが呼ばれると困るので、
150
+ コンストラクタ(処理としては「何もしない」)を定義する。
151
+
152
+ 上記対応により継承元のコンストラクタを呼ばなくなったため、
153
+ super().__init__() を別の関数(open)に書くことで、
154
+ そのタイミングで継承元のコンストラクタを呼び出す。
155
+ """
156
+ def __init__(self):
157
+ pass
158
+ def open(self, master):
159
+ # Toplevel のコンストラクタ呼び出し(ここでToplevelウィンドウを表示する)
160
+ super().__init__()
161
+ # Toplevel の設定
162
+ self.geometry("200x200+25+25")
163
+ self.title("sub")
164
+ self.attributes("-topmost", True)
165
+ self.grab_set()
166
+ self.transient(master)
167
+ self.focus_set()
168
+ self.protocol("WM_DELETE_WINDOW", self.close)
169
+
170
+ def close(self):
171
+ self.grab_release()
172
+ self.destroy()
173
+
174
+ def main():
175
+ app = Main()
176
+ app.mainloop()
177
+
178
+ if __name__ == "__main__":
179
+ main()
82
180
  ```