質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1482閲覧

【Tkinter】複数行 値の入力→計算→出力の実装方法について

imotareobasan

総合スコア6

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/01/21 13:21

編集2020/01/21 13:23

Python初心者です。
円面積または円周を計算するアプリを作成しています。

プルダウンから円面積または円周を選択し、左のテキストボックスに半径を入力して、
実行ボタンを押すと右のテキストボックスに計算結果が表示されるというものです。
1回に20行(20個)まとめて計算できるものにしようと考えています。

現在、値の入出力の箇所の実装方法が思いつかず困っております。
どなたか教えてください。よろしくお願いいたします。

現在の入力されているコードは以下のページを参考にして作成しています。
https://teratail.com/questions/235208 (私の過去質問)
http://ja.voidcc.com/question/p-wneapznl-op.html

Python

1# -*- coding: utf-8 -*- 2from tkinter import * 3import tkinter as tk 4import tkinter.ttk as ttk 5 6#円面積・計算式 7def menseki(self): 8 inputNum = int(entry.get()) 9 menseki = str(inputNum * inputNum * 3.14) 10 return menseki 11 12#円周・計算式 13def enshu(self): 14 inputNum = int(entry.get()) 15 enshu = str(2 * inputNum * 3.14) 16 return enshu 17 18#プルダウンリスト 19action = { 20 "1.円面積":menseki, 21 "2.円周": enshu, 22} 23 24#値の入出力 25def calculate(): 26 value = int(entry.get()) 27 calc = action.get(combo.get()) 28 answer.delete(0, tk.END) 29 answer.insert(0, calc(value)) 30 31#入力値・出力値をクリア 32def delete(): 33 entry.delete(0,tk.END) 34 answer.delete(0, tk.END) 35 36#ウインド画面の作成 37root = tk.Tk() 38root.title("円面積・円周 計算アプリ") 39root.geometry("400x400") 40 41def _on_frame_configure(self, event=None): 42 canvas.configure(scrollregion=canvas.bbox("all")) 43 44#プルダウンの設定 45combo = ttk.Combobox(root, state="readonly",width=26) 46combo["values"] = list(action.keys()) 47combo.place(x=80, y=50) 48 49#フレームの設定 50frame =Frame(root, borderwidth=1, relief=SUNKEN,bg="black") 51frame.grid(column=0, row=0, padx=50, pady=100) 52 53#スクロールバーの設定 54yscrollbar = Scrollbar(frame) 55yscrollbar.grid(column=1, row=0, sticky=N+S) 56 57#キャンバスの設定 58canvas = Canvas(frame, width=290, height=220,bd=0,yscrollcommand=yscrollbar.set) 59canvas.grid(column=0, row=0, sticky=N+S+E+W) 60 61#スクロールバーを動かす 62yscrollbar.config(command=canvas.yview) 63 64 65frame = Frame(canvas, borderwidth=1, relief=SUNKEN) 66canvas.create_window(4,4,window=frame, anchor='nw') 67frame.bind("<Configure>",_on_frame_configure) 68 69#ラベル・テキストボックスの設定 70for i in range(1, 21): 71 #番号 72 label = ttk.Label(frame, text=""+str(i)) 73 label.grid(column=1, row=i, sticky=W) 74 75 #入力箇所 76 entry = ttk.Entry(frame, textvariable="") 77 entry.grid(column=2, row=i, sticky=W) 78 79 #計算結果を示す右矢印 80 labe2 = ttk.Label(frame, text="⇒") 81 labe2.grid(column=3, row=i, sticky=W) 82 83 #出力箇所 84 answer = ttk.Entry(frame, textvariable="") 85 answer.grid(column=4, row=i, sticky=W) 86 87# 実行ボタンの設定 88button1=tk.Button(root,text="実行",font=("Meiryo UI",8),width=8,height=2,bg="steel blue",fg="white",command=calculate) 89button1.place(x=300, y=30) 90 91#クリアボタンの設定 92button2=tk.Button(root,text="全クリア",font=("Meiryo UI",8),width=8,height=2,bg="ivory2",fg="black",command=delete) 93button2.place(x=300, y=350) 94 95root.mainloop()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

entryとanswerをリストに保持しておくのがいいと思います。
こんな感じで。

python

1from tkinter import * 2import tkinter as tk 3import tkinter.ttk as ttk 4 5PI = 3.14 6 7 8def menseki(r): 9 """円面積を計算して返す""" 10 return PI * r**2 11 12 13def enshu(r): 14 """円周の長さを計算して返す""" 15 return 2 * PI * r 16 17 18def nop(r): 19 pass 20 21 22# プルダウンリスト 23action = { 24 "1.円面積": menseki, 25 "2.円周": enshu, 26} 27 28def calculate(): 29 """計算""" 30 for entry, answer in zip(entries, answers): 31 answer.delete(0, tk.END) 32 try: 33 value = int(entry.get().strip()) 34 calc = action.get(combo.get(), nop) 35 answer.insert(0, calc(value)) 36 except ValueError: 37 pass 38 39 40def delete(): 41 """入力値・出力値をクリア""" 42 for entry, answer in zip(entries, answers): 43 entry.delete(0, tk.END) 44 answer.delete(0, tk.END) 45 46 47# ウインド画面の作成 48root = tk.Tk() 49root.title("円面積・円周 計算アプリ") 50root.geometry("400x400") 51 52 53def _on_frame_configure(self, event=None): 54 canvas.configure(scrollregion=canvas.bbox("all")) 55 56 57# プルダウンの設定 58combo = ttk.Combobox(root, state="readonly", width=26) 59combo["values"] = list(action.keys()) 60combo.place(x=80, y=50) 61 62# フレームの設定 63frame = Frame(root, borderwidth=1, relief=SUNKEN, bg="black") 64frame.grid(column=0, row=0, padx=50, pady=100) 65 66# スクロールバーの設定 67yscrollbar = Scrollbar(frame) 68yscrollbar.grid(column=1, row=0, sticky=N+S) 69 70# キャンバスの設定 71canvas = Canvas(frame, width=290, height=220, bd=0, 72 yscrollcommand=yscrollbar.set) 73canvas.grid(column=0, row=0, sticky=N+S+E+W) 74 75# スクロールバーを動かす 76yscrollbar.config(command=canvas.yview) 77 78 79frame = Frame(canvas, borderwidth=1, relief=SUNKEN) 80canvas.create_window(4, 4, window=frame, anchor='nw') 81frame.bind("<Configure>", _on_frame_configure) 82 83# ラベル・テキストボックスの設定 84entries = [] 85answers = [] 86for i in range(1, 21): 87 # 番号 88 label = ttk.Label(frame, text=""+str(i)) 89 label.grid(column=1, row=i, sticky=W) 90 91 # 入力箇所 92 entry = ttk.Entry(frame, textvariable="") 93 entry.grid(column=2, row=i, sticky=W) 94 entries.append(entry) 95 96 # 計算結果を示す右矢印 97 labe2 = ttk.Label(frame, text="⇒") 98 labe2.grid(column=3, row=i, sticky=W) 99 100 # 出力箇所 101 answer = ttk.Entry(frame, textvariable="") 102 answer.grid(column=4, row=i, sticky=W) 103 answers.append(answer) 104 105# 実行ボタンの設定 106button1 = tk.Button(root, text="実行", font=("Meiryo UI", 8), width=8, 107 height=2, bg="steel blue", fg="white", command=calculate) 108button1.place(x=300, y=30) 109 110# クリアボタンの設定 111button2 = tk.Button(root, text="全クリア", font=("Meiryo UI", 8), 112 width=8, height=2, bg="ivory2", fg="black", command=delete) 113button2.place(x=300, y=350) 114 115root.mainloop()

もし、クラス定義(ユーザ定義データ型)を理解できるなら、entry と answer をまとめたクラスにするのもいい手だと思います。

python

1from tkinter import * 2import tkinter as tk 3import tkinter.ttk as ttk 4 5PI = 3.14 6 7 8def menseki(r): 9 """円面積を計算して返す""" 10 return PI * r**2 11 12 13def enshu(r): 14 """円周の長さを計算して返す""" 15 return 2 * PI * r 16 17 18# プルダウンリスト 19action = { 20 "1.円面積": menseki, 21 "2.円周": enshu, 22} 23 24 25class CaluculateVar: 26 27 def __init__(self): 28 self.entry = tk.StringVar() 29 self.answer = tk.StringVar() 30 31 def calculate(self, formura): 32 try: 33 self.answer.set(formura(int(self.entry.get()))) 34 except ValueError: 35 self.answer.set("") 36 37 def clear(self): 38 self.entry.set("") 39 self.answer.set("") 40 41 42def calculate(): 43 """一括計算""" 44 formura = action.get(combo.get()) 45 if not formura: 46 return 47 for variable in variables: 48 variable.calculate(formura) 49 50 51def clear(): 52 """入力値・出力値をクリア""" 53 for variable in variables: 54 variable.clear() 55 56 57# ウインド画面の作成 58root = tk.Tk() 59root.title("円面積・円周 計算アプリ") 60root.geometry("400x400") 61 62 63def _on_frame_configure(self, event=None): 64 canvas.configure(scrollregion=canvas.bbox("all")) 65 66 67# プルダウンの設定 68combo = ttk.Combobox(root, state="readonly", width=26) 69combo["values"] = list(action.keys()) 70combo.place(x=80, y=50) 71 72# フレームの設定 73frame = Frame(root, borderwidth=1, relief=SUNKEN, bg="black") 74frame.grid(column=0, row=0, padx=50, pady=100) 75 76# スクロールバーの設定 77yscrollbar = Scrollbar(frame) 78yscrollbar.grid(column=1, row=0, sticky=N+S) 79 80# キャンバスの設定 81canvas = Canvas(frame, width=290, height=220, bd=0, 82 yscrollcommand=yscrollbar.set) 83canvas.grid(column=0, row=0, sticky=N+S+E+W) 84 85# スクロールバーを動かす 86yscrollbar.config(command=canvas.yview) 87 88 89frame = Frame(canvas, borderwidth=1, relief=SUNKEN) 90canvas.create_window(4, 4, window=frame, anchor='nw') 91frame.bind("<Configure>", _on_frame_configure) 92 93# ラベル・テキストボックスの設定 94variables = [CaluculateVar() for _ in range(20)] 95for i, variable in enumerate(variables, 1): 96 # 番号 97 label = ttk.Label(frame, text=str(i)) 98 label.grid(column=1, row=i, sticky=W) 99 100 # 入力箇所 101 entry = ttk.Entry(frame, textvariable=variable.entry) 102 entry.grid(column=2, row=i, sticky=W) 103 104 # 計算結果を示す右矢印 105 labe2 = ttk.Label(frame, text="⇒") 106 labe2.grid(column=3, row=i, sticky=W) 107 108 # 出力箇所 109 answer = ttk.Entry(frame, textvariable=variable.answer) 110 answer.grid(column=4, row=i, sticky=W) 111 112# 実行ボタンの設定 113button1 = tk.Button(root, text="実行", font=("Meiryo UI", 8), width=8, 114 height=2, bg="steel blue", fg="white", command=calculate) 115button1.place(x=300, y=30) 116 117# クリアボタンの設定 118button2 = tk.Button(root, text="全クリア", font=("Meiryo UI", 8), 119 width=8, height=2, bg="ivory2", fg="black", command=clear) 120button2.place(x=300, y=350) 121 122root.mainloop()

投稿2020/01/21 14:23

編集2020/01/22 03:16
shiracamus

総合スコア5406

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問