回答編集履歴

1

質問の編集を受けて、回答を追記

2019/08/28 23:46

投稿

magichan
magichan

スコア15898

test CHANGED
@@ -51,3 +51,91 @@
51
51
  weatherget()
52
52
 
53
53
  ```
54
+
55
+
56
+
57
+ ---
58
+
59
+
60
+
61
+ **【編集を受けて追記】**
62
+
63
+
64
+
65
+ 今回、サブウィンドウの生成に``tk.Tk()``を呼んでおりますが、``tk.Toplevel()``を使用してください。
66
+
67
+
68
+
69
+ サブウィンドウを生成する際にトップレベルウィジェット(tk.Tk())を生成してしまいますと、サブウィンドウの``mainloop()``が動作している間、親ウィンドウの``mainloop()``が動作しなくなるために不具合を引き起こします。
70
+
71
+ ``tk.Toplevel()`` の場合は親ウィンドウの ``mainloop()`` に同居しますので、新たに``mainloop()`` を呼ぶ必要がなく、親ウィンドウとサブウィンドウを同時に動作させることができます。
72
+
73
+
74
+
75
+ ということで、weatherget関数を書き換えると以下のようになります。
76
+
77
+
78
+
79
+ ```Python
80
+
81
+ def weatherget(main_window):
82
+
83
+ # 変更:tk.Tk ではなく Toplevel(サブウィンドウ) を使う
84
+
85
+ weatherwindow=tk.Toplevel(main_window)
86
+
87
+ # 追加:modal(main_windowのコントロールを抑制する) に設定
88
+
89
+ # これを行わないとサブウィンドウ表示中も親ウィンドウのボタンが押せてしまう
90
+
91
+ weatherwindow.grab_set()
92
+
93
+ weatherwindow.title('天気を調べる')
94
+
95
+ weatherwindow.geometry('150x150')
96
+
97
+ radio_value=tk.IntVar()
98
+
99
+ radio_value.set(0)
100
+
101
+ character={0:'今日の天気',1:'明日の天気',2:'明後日の天気'}
102
+
103
+ tk.Radiobutton(weatherwindow, text=character[0], variable = radio_value, value = 0).pack()
104
+
105
+ tk.Radiobutton(weatherwindow, text=character[1], variable = radio_value, value = 1).pack()
106
+
107
+ tk.Radiobutton(weatherwindow, text=character[2], variable = radio_value, value = 2).pack()
108
+
109
+ def get():
110
+
111
+ date = radio_value.get()
112
+
113
+ print(date)
114
+
115
+ get_weather.weather(date)
116
+
117
+ weatherwindow.destroy()
118
+
119
+ tk.Button(weatherwindow, text='調べる', command=get).pack()
120
+
121
+ # 削除 : mainloopは親 Windowと共通なのでこの処理はいらない
122
+
123
+ # weatherwindow.mainloop()
124
+
125
+ ```
126
+
127
+
128
+
129
+ また、この変更で関数に引数(main_window : メインウィンドウ)が追加されたので呼び出し側も
130
+
131
+
132
+
133
+ ```Python
134
+
135
+ button=tk.Button(window,text="天気を調べる", command=lambda: weatherget(window)).pack()
136
+
137
+ ```
138
+
139
+
140
+
141
+ のように修正する必要があります。