回答編集履歴

1

クラスを使った実装例を追加

2020/01/22 03:16

投稿

shiracamus
shiracamus

スコア5406

test CHANGED
@@ -237,3 +237,257 @@
237
237
  root.mainloop()
238
238
 
239
239
  ```
240
+
241
+
242
+
243
+ もし、クラス定義(ユーザ定義データ型)を理解できるなら、entry と answer をまとめたクラスにするのもいい手だと思います。
244
+
245
+
246
+
247
+ ```python
248
+
249
+ from tkinter import *
250
+
251
+ import tkinter as tk
252
+
253
+ import tkinter.ttk as ttk
254
+
255
+
256
+
257
+ PI = 3.14
258
+
259
+
260
+
261
+
262
+
263
+ def menseki(r):
264
+
265
+ """円面積を計算して返す"""
266
+
267
+ return PI * r**2
268
+
269
+
270
+
271
+
272
+
273
+ def enshu(r):
274
+
275
+ """円周の長さを計算して返す"""
276
+
277
+ return 2 * PI * r
278
+
279
+
280
+
281
+
282
+
283
+ # プルダウンリスト
284
+
285
+ action = {
286
+
287
+ "1.円面積": menseki,
288
+
289
+ "2.円周": enshu,
290
+
291
+ }
292
+
293
+
294
+
295
+
296
+
297
+ class CaluculateVar:
298
+
299
+
300
+
301
+ def __init__(self):
302
+
303
+ self.entry = tk.StringVar()
304
+
305
+ self.answer = tk.StringVar()
306
+
307
+
308
+
309
+ def calculate(self, formura):
310
+
311
+ try:
312
+
313
+ self.answer.set(formura(int(self.entry.get())))
314
+
315
+ except ValueError:
316
+
317
+ self.answer.set("")
318
+
319
+
320
+
321
+ def clear(self):
322
+
323
+ self.entry.set("")
324
+
325
+ self.answer.set("")
326
+
327
+
328
+
329
+
330
+
331
+ def calculate():
332
+
333
+ """一括計算"""
334
+
335
+ formura = action.get(combo.get())
336
+
337
+ if not formura:
338
+
339
+ return
340
+
341
+ for variable in variables:
342
+
343
+ variable.calculate(formura)
344
+
345
+
346
+
347
+
348
+
349
+ def clear():
350
+
351
+ """入力値・出力値をクリア"""
352
+
353
+ for variable in variables:
354
+
355
+ variable.clear()
356
+
357
+
358
+
359
+
360
+
361
+ # ウインド画面の作成
362
+
363
+ root = tk.Tk()
364
+
365
+ root.title("円面積・円周 計算アプリ")
366
+
367
+ root.geometry("400x400")
368
+
369
+
370
+
371
+
372
+
373
+ def _on_frame_configure(self, event=None):
374
+
375
+ canvas.configure(scrollregion=canvas.bbox("all"))
376
+
377
+
378
+
379
+
380
+
381
+ # プルダウンの設定
382
+
383
+ combo = ttk.Combobox(root, state="readonly", width=26)
384
+
385
+ combo["values"] = list(action.keys())
386
+
387
+ combo.place(x=80, y=50)
388
+
389
+
390
+
391
+ # フレームの設定
392
+
393
+ frame = Frame(root, borderwidth=1, relief=SUNKEN, bg="black")
394
+
395
+ frame.grid(column=0, row=0, padx=50, pady=100)
396
+
397
+
398
+
399
+ # スクロールバーの設定
400
+
401
+ yscrollbar = Scrollbar(frame)
402
+
403
+ yscrollbar.grid(column=1, row=0, sticky=N+S)
404
+
405
+
406
+
407
+ # キャンバスの設定
408
+
409
+ canvas = Canvas(frame, width=290, height=220, bd=0,
410
+
411
+ yscrollcommand=yscrollbar.set)
412
+
413
+ canvas.grid(column=0, row=0, sticky=N+S+E+W)
414
+
415
+
416
+
417
+ # スクロールバーを動かす
418
+
419
+ yscrollbar.config(command=canvas.yview)
420
+
421
+
422
+
423
+
424
+
425
+ frame = Frame(canvas, borderwidth=1, relief=SUNKEN)
426
+
427
+ canvas.create_window(4, 4, window=frame, anchor='nw')
428
+
429
+ frame.bind("<Configure>", _on_frame_configure)
430
+
431
+
432
+
433
+ # ラベル・テキストボックスの設定
434
+
435
+ variables = [CaluculateVar() for _ in range(20)]
436
+
437
+ for i, variable in enumerate(variables, 1):
438
+
439
+ # 番号
440
+
441
+ label = ttk.Label(frame, text=str(i))
442
+
443
+ label.grid(column=1, row=i, sticky=W)
444
+
445
+
446
+
447
+ # 入力箇所
448
+
449
+ entry = ttk.Entry(frame, textvariable=variable.entry)
450
+
451
+ entry.grid(column=2, row=i, sticky=W)
452
+
453
+
454
+
455
+ # 計算結果を示す右矢印
456
+
457
+ labe2 = ttk.Label(frame, text="⇒")
458
+
459
+ labe2.grid(column=3, row=i, sticky=W)
460
+
461
+
462
+
463
+ # 出力箇所
464
+
465
+ answer = ttk.Entry(frame, textvariable=variable.answer)
466
+
467
+ answer.grid(column=4, row=i, sticky=W)
468
+
469
+
470
+
471
+ # 実行ボタンの設定
472
+
473
+ button1 = tk.Button(root, text="実行", font=("Meiryo UI", 8), width=8,
474
+
475
+ height=2, bg="steel blue", fg="white", command=calculate)
476
+
477
+ button1.place(x=300, y=30)
478
+
479
+
480
+
481
+ # クリアボタンの設定
482
+
483
+ button2 = tk.Button(root, text="全クリア", font=("Meiryo UI", 8),
484
+
485
+ width=8, height=2, bg="ivory2", fg="black", command=clear)
486
+
487
+ button2.place(x=300, y=350)
488
+
489
+
490
+
491
+ root.mainloop()
492
+
493
+ ```