回答編集履歴

2

問題のページ遷移方法を追記

2021/09/30 23:27

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -35,3 +35,195 @@
35
35
  create_question(frame_app_1,ans,frame,Out_Integ)
36
36
 
37
37
  ```
38
+
39
+
40
+
41
+ ----
42
+
43
+ 追記2: コメントで説明した実装例
44
+
45
+
46
+
47
+ レイアウト等は省き、ページ遷移を確かめる最小限のコードです。
48
+
49
+
50
+
51
+ ```python
52
+
53
+
54
+
55
+
56
+
57
+ import tkinter as tk
58
+
59
+ from tkinter import ttk
60
+
61
+
62
+
63
+ def frame_grid_config(frame):
64
+
65
+ frame.grid_rowconfigure(0, weight=1)
66
+
67
+ frame.grid_columnconfigure(0, weight=1)
68
+
69
+
70
+
71
+ def frame_create(parent):
72
+
73
+ # NOTE: 親ウィジェットを指定できるように変更
74
+
75
+ frame = ttk.Frame(parent)
76
+
77
+ frame.grid(row=0, column=0, sticky=tk.NSEW, pady=20)
78
+
79
+ return frame
80
+
81
+
82
+
83
+ root = tk.Tk()
84
+
85
+ root.geometry("600x600")
86
+
87
+ frame_home = frame_create(root)
88
+
89
+ frame_app_1 = frame_create(root)
90
+
91
+ frame_app_2 = frame_create(root)
92
+
93
+ frame_app_3 = frame_create(root)
94
+
95
+
96
+
97
+ frame_grid_config(root)
98
+
99
+ frame_grid_config(frame_app_1)
100
+
101
+ frame_grid_config(frame_app_2)
102
+
103
+ frame_grid_config(frame_app_3)
104
+
105
+
106
+
107
+ def create_app_1(parent):
108
+
109
+ frames = []
110
+
111
+
112
+
113
+ def back_home():
114
+
115
+ # NOTE: 戻る時に、最初の問題を一番上に戻しておく
116
+
117
+ frames[0].tkraise()
118
+
119
+ frame_home.tkraise()
120
+
121
+
122
+
123
+ for i, _ in enumerate(range(5), start=1):
124
+
125
+ frame = frame_create(parent)
126
+
127
+ frames.append(frame)
128
+
129
+ label = ttk.Label(frame, text=f"問題{i}")
130
+
131
+ label.pack()
132
+
133
+
134
+
135
+ home_button = ttk.Button(frame, text="Home",
136
+
137
+ command=back_home)
138
+
139
+ home_button.pack()
140
+
141
+
142
+
143
+ for frame, next_frame in zip(frames, frames[1:]):
144
+
145
+ button = ttk.Button(frame, text="次の問題へ",
146
+
147
+ command=next_frame.tkraise)
148
+
149
+ button.pack()
150
+
151
+ else:
152
+
153
+ # 最後の問題
154
+
155
+ frame = frames[-1]
156
+
157
+
158
+
159
+ # 最初の問題を一番上へ
160
+
161
+ frames[0].tkraise()
162
+
163
+
164
+
165
+
166
+
167
+ def create_home(parent):
168
+
169
+ button1 = ttk.Button(parent, text="1",
170
+
171
+ command=frame_app_1.tkraise)
172
+
173
+ button2 = ttk.Button(parent, text="2",
174
+
175
+ command=frame_app_2.tkraise)
176
+
177
+ button3 = ttk.Button(parent, text="3",
178
+
179
+ command=frame_app_3.tkraise)
180
+
181
+
182
+
183
+ button1.pack()
184
+
185
+ button2.pack()
186
+
187
+ button3.pack()
188
+
189
+
190
+
191
+ parent.tkraise()
192
+
193
+
194
+
195
+ create_app_1(frame_app_1)
196
+
197
+ create_home(frame_home)
198
+
199
+
200
+
201
+ root.after_idle(frame_home.tkraise)
202
+
203
+ root.mainloop()
204
+
205
+ ```
206
+
207
+
208
+
209
+ 次の問題へのボタンは、複数のリストを組み合わせる zip 関数を使い
210
+
211
+ 「現在の問題」「次の問題」のループを作成しています。
212
+
213
+
214
+
215
+ ```python
216
+
217
+ # zip の例
218
+
219
+ zip([1,2,3], [4,5,6]) # => [(1,4), (2,5), (3,6)]
220
+
221
+
222
+
223
+ xs = [1,2,3,4]
224
+
225
+
226
+
227
+ zip(xs, xs[1:]) # => [(1,2), (2,3), (3,4)]
228
+
229
+ ```

1

コード中の問題点を追記

2021/09/30 23:27

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -19,3 +19,19 @@
19
19
  一旦前の内容を全て破棄 (destroy) して、新規に作成します。
20
20
 
21
21
  こちらの場合は tkraise() は不要です。
22
+
23
+
24
+
25
+ ----
26
+
27
+ 追記: 問題毎にFrame は作成してるようですが、create_question に渡すところで
28
+
29
+ frame_app_1 が固定になってます。
30
+
31
+
32
+
33
+ ```python
34
+
35
+ create_question(frame_app_1,ans,frame,Out_Integ)
36
+
37
+ ```