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

質問編集履歴

5

解決方法、注意点の記述

2019/12/24 04:41

投稿

YUMA-NAGAO
YUMA-NAGAO

スコア41

title CHANGED
File without changes
body CHANGED
@@ -179,4 +179,61 @@
179
179
  tkinterでタブを削除した後
180
180
  While文内のif文を何度も実行してうまく挙動させるに葉どうしたらいいのか?
181
181
  もしくは、while文を使わないでif文の挙動を何回もできるようにしたいです。
182
- もしくはTkinterを使わないでも実装できるやり方を知りたいです。
182
+ もしくはTkinterを使わないでも実装できるやり方を知りたいです。
183
+
184
+ #解決コード
185
+ サブウィンドウを作成し、それを何度も破壊することでメインウィンドウを削除しないでもよくなった。
186
+ ※回答欄から転載
187
+
188
+ ```Python
189
+ import tkinter
190
+ from tkinter import messagebox
191
+
192
+ # ウインドウ
193
+ root = tkinter.Tk()
194
+ root.withdraw()
195
+
196
+ def on_start():
197
+ messagebox.showinfo('', '開始!!!!')
198
+ # 次にmainloop内から main_proc() 関数を呼ぶ
199
+ root.after(0, main_proc)
200
+
201
+ def main_proc():
202
+ # ここで設定Windowを Toplevel Widget にて作成
203
+ global top
204
+ top = tkinter.Toplevel(root)
205
+ top.deiconify()
206
+ top.title(u"調整")
207
+ top.geometry("250x120")
208
+ # 以下に 設定画面を作成(省略)
209
+
210
+ # Toplevel Widgetが閉じられるときは on_close()関数を呼ぶ
211
+ top.protocol("WM_DELETE_WINDOW", on_closing)
212
+
213
+ def on_closing():
214
+ # Toplevel Widgetを破棄
215
+ top.destroy()
216
+ # 確認用ダイアログを出す
217
+ onemore = messagebox.askyesno('Adjusts_Onemore', 'もう一度調整しますか?')
218
+ if onemore:
219
+ # 再度 mainloop内から main_proc() 関数を呼ぶ
220
+ root.after(0, main_proc)
221
+ else:
222
+ # 完了ダイアログを出す
223
+ messagebox.showinfo('', '完了!!')
224
+ # rootを破棄(これでmainloopを抜けるはず)
225
+ root.destroy()
226
+
227
+ # 最初にmainloop内から on_start() 関数を呼ぶ
228
+ root.after(0, on_start)
229
+ root.mainloop()
230
+
231
+ ```
232
+ ##注意点
233
+ commandで関数を指定するときは、
234
+ command=on_closing()
235
+ ではなく、
236
+ command=on_closing
237
+ と記述する。
238
+ commandパラメータに渡すのは、「関数」を渡す。
239
+ 括弧つきで記述すると、その場で関数が実行され、その戻り値がcommandパラメータに渡すという意味になってしまうので、注意が必要。

4

文章を構成しなおした。

2019/12/24 04:41

投稿

YUMA-NAGAO
YUMA-NAGAO

スコア41

title CHANGED
File without changes
body CHANGED
@@ -1,7 +1,6 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
- ここに質問の内容を詳しく書いてください。
4
- (例)pythonでいいえが押されるまで何回も調整しなおすシステムを作っています。
3
+ Pythonでいいえが押されるまで質問システムを作っています。
5
4
  Tkinterを使い何度も分岐をする機能を実装中に以下のエラーメッセージが発生しました。
6
5
 
7
6
  ### 発生している問題・エラーメッセージ

3

自分なりに直してみたことを追記のソースコードとして追記しました。

2019/12/24 04:28

投稿

YUMA-NAGAO
YUMA-NAGAO

スコア41

title CHANGED
File without changes
body CHANGED
@@ -76,6 +76,95 @@
76
76
  messagebox.showinfo('', '完了!!')
77
77
 
78
78
 
79
+
80
+
81
+
82
+
83
+
84
+ #追記のソースコードここから
85
+
86
+
87
+
88
+
89
+ import tkinter
90
+ from tkinter import messagebox
91
+
92
+ # ウインドウ
93
+ root = tkinter.Tk()
94
+
95
+
96
+ # root.withdraw()
97
+
98
+
99
+ def on_start():
100
+ messagebox.showinfo('', '開始!!!!')
101
+ # 次にmainloop内から main_proc() 関数を呼ぶ
102
+ root.after(0, main_proc)
103
+ # 0秒後にmain_procという関数を呼ぶという意味
104
+
105
+
106
+ def main_proc():
107
+ # ここで設定Windowを Toplevel Widget にて作成
108
+ global top
109
+ top = tkinter.Toplevel(root)
110
+ top.deiconify()
111
+ top.title(u"調整")
112
+ top.geometry("250x120")
113
+ # 以下に 設定画面を作成(省略)
114
+ Static1 = tkinter.Label(top, text=u'+か-を入れてください!')
115
+ Static1.pack()
116
+ EditBox1 = tkinter.Entry(top)
117
+ EditBox1.insert(tkinter.END, '+')
118
+ EditBox1.pack()
119
+
120
+ Static2 = tkinter.Label(top, text=u'100単位で数字を入れてください')
121
+ Static2.pack()
122
+ EditBox2 = tkinter.Entry(top)
123
+ EditBox2.insert(tkinter.END, '100')
124
+ EditBox2.pack()
125
+
126
+ button = tkinter.Button(top, text='確定', width='10',command=on_closing())
127
+ button.pack()
128
+
129
+ sign = EditBox1.get()
130
+ value = EditBox2.get()
131
+
132
+ root.mainloop()
133
+
134
+ anka = 'm:1' + sign + 'p' + value + '\r\n'
135
+
136
+ # 文字列の結合
137
+ # 相対移動文字列を作る
138
+ # 関数内関数作ってもいいんじゃね?
139
+
140
+ # ser.write(bytes(anka, 'UTF-8'))
141
+ # ser.write(b'g:\r\n')
142
+
143
+ print(anka)
144
+
145
+ # Toplevel Widgetが閉じられるときは on_close()関数を呼ぶ
146
+
147
+
148
+
149
+ def on_closing():
150
+ top.destroy()
151
+ # 確認用ダイアログを出す
152
+ onemore = messagebox.askyesno('Adjusts_Onemore', 'もう一度調整しますか?')
153
+ if onemore:
154
+ # 再度 mainloop内から main_proc() 関数を呼ぶ
155
+ root.after(0, main_proc)
156
+ else:
157
+ # 完了ダイアログを出す
158
+ messagebox.showinfo('', '完了!!')
159
+ # rootを破棄(これでmainloopを抜けるはず)
160
+ root.destroy()
161
+
162
+
163
+ # 最初にmainloop内から on_start() 関数を呼ぶ
164
+ root.after(0, on_start)
165
+ root.mainloop()
166
+
167
+
79
168
  ```
80
169
 
81
170
  ### 試したこと

2

なんのために、deiconify()を使っているかの追記

2019/10/30 02:46

投稿

YUMA-NAGAO
YUMA-NAGAO

スコア41

title CHANGED
File without changes
body CHANGED
@@ -27,6 +27,7 @@
27
27
  messagebox.showinfo('', '開始!!!!')
28
28
 
29
29
 
30
+
30
31
  def ajust_moving():
31
32
  # データ数入力
32
33
  root.deiconify()
@@ -65,7 +66,6 @@
65
66
 
66
67
  OneMore_adjust = messagebox.askyesno('Adjusts_Onemore', 'もう一度調整しますか?')
67
68
  if OneMore_adjust:
68
- # ここに、メッセージボックスの入れるやつを作る
69
69
  ajust_moving()
70
70
 
71
71
  else:
@@ -74,8 +74,8 @@
74
74
  root = tkinter.Tk()
75
75
  root.withdraw()
76
76
  messagebox.showinfo('', '完了!!')
77
- ser.close()
78
77
 
78
+
79
79
  ```
80
80
 
81
81
  ### 試したこと
@@ -84,8 +84,11 @@
84
84
  あと、Tkinterは何度も実行する仕様ではないということも調べた結果わかりました。
85
85
 
86
86
  ###教えていただきたいこと
87
+ 最初と最後は、withdraw()で隠したいです。
88
+ 関数を実行するときは、表示したいとおもっているため 、
89
+ deiconify()を使っています。
90
+
87
91
  tkinterでタブを削除した後
88
92
  While文内のif文を何度も実行してうまく挙動させるに葉どうしたらいいのか?
89
93
  もしくは、while文を使わないでif文の挙動を何回もできるようにしたいです。
90
-
91
94
  もしくはTkinterを使わないでも実装できるやり方を知りたいです。

1

教えていただきたいことをコメントを受けて修正させていただきました。

2019/10/30 00:47

投稿

YUMA-NAGAO
YUMA-NAGAO

スコア41

title CHANGED
File without changes
body CHANGED
@@ -85,6 +85,7 @@
85
85
 
86
86
  ###教えていただきたいこと
87
87
  tkinterでタブを削除した後
88
- While文を何度も実行るにどうすればいいのか?
88
+ While文内のif文を何度も実行してうまく挙動させるにどうしたらいいのか?
89
+ もしくは、while文を使わないでif文の挙動を何回もできるようにしたいです。
89
90
 
90
91
  もしくはTkinterを使わないでも実装できるやり方を知りたいです。