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

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

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

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

Q&A

解決済

3回答

2839閲覧

Python 複数のtextboxの数値を合計して別のtextboxへ表示したい

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2019/07/18 11:35

前提・実現したいこと

前回の回答でその時の問題は解決できました。 有難うございました。

其れを基に少し進展したのですが、下記問題が解決できません。

二つのtextboxの数値を合計して、別のtextboxに表示させたいのですが、
それぞれ別の関数でtextboxの数値を選択していますので、変数のスコープが
違うためなのでしょうが、図に示したように片方の数値しか表示できません。

どこへどう書けば合計表示できるでしょうか。

宜しくお願い致します。

発生している問題・エラーメッセージ

エラー表示は出ませんが、合計ではなく最後に選んだ数値の方だけが表示されてしまします。

該当のソースコード

Python

1 2#EV計算機2.py 7/18/2019 3 4from tkinter import * 5import tkinter 6 7if __name__ == "__main__": 8 root = tkinter.Tk() 9 root.title("kumasanのEV計算機") 10 root.geometry("270x400") 11 12 label_f=tkinter.Label(root,text="Aperture", bg="lightblue") 13 label_f.place(x=20,y=20) 14 label_tso=tkinter.Label(root,text="Shutter Speed", bg="lightblue") 15 label_tso.place(x=150,y=20) 16 17 label_EV=tkinter.Label(root,text="Total EV", bg="red") 18 label_EV.place(x=20, y=280) 19 20 #### EV表示用 #### 21 22 textbox_f=tkinter.Entry(width=5) 23 textbox_f.insert(tkinter.END,"F EV") 24 textbox_f.place(x=20 ,y=250) 25 26 textbox_t=tkinter.Entry(width=5) 27 textbox_t.insert(tkinter.END,"T EV") 28 textbox_t.place(x=120 ,y=250) 29 30 textbox_EV=tkinter.Entry(width=10) 31 textbox_EV.insert(tkinter.END,"Total EV") 32 textbox_EV.place(x=80 ,y=280) 33 34 label_F = tkinter.Label(root, text="show_F", bg="lightblue") 35 label_F.place(x=20, y=220) 36 37 def show_item_F(event): 38 #リストクリック時に実行するメソッド 39 item_index2 = listbox_F.curselection() 40 41 if len(item_index2) >= 1: 42 label_F["text"] = listbox_F.get(item_index2) 43 44 ################### Fが変わったらFvも自動で変わる############## 45 textbox_f.delete(0, tkinter.END) 46 Fv=label_F["text"] 47 48 F_EV = {"1.4":1, "2":2, "2.8":3, "4":4, "5.6":5, "8":6, "11":7, "16":8, "22":9, "32":10} 49 textbox_f.insert(tkinter.END, F_EV[Fv] ) 50 #print(type(F_EV[Fv])) # <--- int() 51 52 textbox_EV.delete(0,tkinter.END) 53 textbox_EV.insert(tkinter.END,F_EV[Fv]) 54 55 56 listbox_F = tkinter.Listbox(root,width=8, selectmode="single") 57 listbox_F.bind("<<ListboxSelect>>", show_item_F) 58 li = ["1.4", "2", "2.8", "4", "5.6", "8", "11", "16", "22", "32"] 59 for item in li: 60 listbox_F.insert(tkinter.END, item) 61 listbox_F.place(x=20, y=40) 62 63 ################### 64 label_T = tkinter.Label(root,text="show_T", bg="lightblue") 65 label_T.place(x=120, y=220) 66 67 def show_item_T(event): 68 #リストクリック時に実行するメソッド 69 item_index3 = listbox_T.curselection() 70 71 if len(item_index3) >= 1: 72 label_T["text"] = listbox_T.get(item_index3) 73 74 ################### Tが変わったらTvも自動で変わる############## 75 textbox_t.delete(0, tkinter.END) 76 Tv=label_T["text"] 77 78 T_EV = {"30":-5, "15":-4, "8":-3, "4":-2, "2":-1, "1":0, "1/2":1, "1/4":2, "1/8":3, "1/15":4,"1/30":5, "1/60":6, "1/125":7, "1/250":8, "1/500":9, "1/1000":10, "1/2000":11, "1/4000":12, "1/8000":13} 79 textbox_t.insert(tkinter.END, T_EV[Tv] ) 80 #print(T_EV[Tv]) 81 82 #textbox_EV.delete(0,tkinter.END) 83 textbox_EV.delete(0,tkinter.END) 84 textbox_EV.insert(tkinter.END,T_EV[Tv]) 85 86 87 listbox_T = tkinter.Listbox(root,width=8, height=19,selectmode="single") 88 listbox_T.bind("<<ListboxSelect>>", show_item_T) 89 li = ["30", "15", "8", "4", "2", "1", "1/2", "1/4", "1/8", "1/15", "1/30", "1/60", "1/125", "1/250","1/500", "1/1000", "1/2000", "1/4000","1/8000"] 90 for item in li: 91 listbox_T.insert(tkinter.END, item) 92 listbox_T.place(x=180, y=40) 93 94 ################### F,TのEVが決定したら総合EVの計算表示を行う######################## 95 #Total EV=Fv+Tv の計算をやりたい(例:7+8=15) 96 97 98root.mainloop() 99 100

試したこと

上記のcodeではあとから選んだ方の数値だけが表示されます。 また別に合計用関数が必要なのでしょうか?

補足情報(FW/ツールのバージョンなど)

W10 64bit
Python3.7.3 

イメージ説明

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答3

0

ベストアンサー

様々な方法が考えられますが、現状のコードから変更するには

  • show_item_F(), show_item_F()関数の外にFv値とTv値を格納する変数を置く
  • 上記関数内では 上記の変数をglobal宣言
  • 上記関数が呼ばれたタイミングで上記変数よりTotalを算出して更新

するのが比較的簡単ではないでしょうかね。

Python

1#EV計算機2.py 7/18/2019 2 3from tkinter import * 4import tkinter 5 6if __name__ == "__main__": 7 # 定義 8 F_EV = { 9 "1.4": 1, 10 "2": 2, 11 "2.8": 3, 12 "4": 4, 13 "5.6": 5, 14 "8": 6, 15 "11": 7, 16 "16": 8, 17 "22": 9, 18 "32": 10 19 } 20 T_EV = { 21 "30": -5, 22 "15": -4, 23 "8": -3, 24 "4": -2, 25 "2": -1, 26 "1": 0, 27 "1/2": 1, 28 "1/4": 2, 29 "1/8": 3, 30 "1/15": 4, 31 "1/30": 5, 32 "1/60": 6, 33 "1/125": 7, 34 "1/250": 8, 35 "1/500": 9, 36 "1/1000": 10, 37 "1/2000": 11, 38 "1/4000": 12, 39 "1/8000": 13 40 } 41 # Fv, Tv が格納される変数 42 Fv = 0 43 Tv = 0 44 45 root = tkinter.Tk() 46 root.title("kumasanのEV計算機") 47 root.geometry("270x400") 48 49 label_f = tkinter.Label(root, text="Aperture", bg="lightblue") 50 label_f.place(x=20, y=20) 51 label_tso = tkinter.Label(root, text="Shutter Speed", bg="lightblue") 52 label_tso.place(x=150, y=20) 53 54 label_EV = tkinter.Label(root, text="Total EV", bg="red") 55 label_EV.place(x=20, y=280) 56 57 #### EV表示用 #### 58 59 textbox_f = tkinter.Entry(width=5) 60 textbox_f.insert(tkinter.END, "F EV") 61 textbox_f.place(x=20, y=250) 62 63 textbox_t = tkinter.Entry(width=5) 64 textbox_t.insert(tkinter.END, "T EV") 65 textbox_t.place(x=120, y=250) 66 67 textbox_EV = tkinter.Entry(width=10) 68 textbox_EV.insert(tkinter.END, "Total EV") 69 textbox_EV.place(x=80, y=280) 70 71 label_F = tkinter.Label(root, text="show_F", bg="lightblue") 72 label_F.place(x=20, y=220) 73 74 def show_item_F(event): 75 # Fv, Tv は関数の外で宣言した変数を使う 76 global Fv, Tv 77 #リストクリック時に実行するメソッド 78 item_index2 = listbox_F.curselection() 79 80 if len(item_index2) >= 1: 81 # F値 Fv値を更新 82 f = listbox_F.get(item_index2) 83 Fv = F_EV[f] 84 85 # ラベルの更新 86 label_F["text"] = f 87 88 ################### Fが変わったらFvも自動で変わる############## 89 textbox_f.delete(0, tkinter.END) 90 textbox_f.insert(tkinter.END, Fv) 91 92 # Totalの更新 93 textbox_EV.delete(0, tkinter.END) 94 textbox_EV.insert(tkinter.END, Fv + Tv) 95 96 listbox_F = tkinter.Listbox(root, width=8, selectmode="single") 97 listbox_F.bind("<<ListboxSelect>>", show_item_F) 98 for item in F_EV.keys(): 99 listbox_F.insert(tkinter.END, item) 100 listbox_F.place(x=20, y=40) 101 102 ################### 103 label_T = tkinter.Label(root, text="show_T", bg="lightblue") 104 label_T.place(x=120, y=220) 105 106 def show_item_T(event): 107 # Fv, Tv は関数の外で宣言した変数を使う 108 global Fv, Tv 109 110 #リストクリック時に実行するメソッド 111 item_index3 = listbox_T.curselection() 112 113 if len(item_index3) >= 1: 114 # T値 Tv値の更新 115 t = listbox_T.get(item_index3) 116 Tv = T_EV[t] 117 118 # ラベルの更新 119 label_T["text"] = t 120 121 ################### Tが変わったらTvも自動で変わる############## 122 textbox_t.delete(0, tkinter.END) 123 textbox_t.insert(tkinter.END, Tv) 124 125 # Totalの更新 126 textbox_EV.delete(0, tkinter.END) 127 textbox_EV.insert(tkinter.END, Fv + Tv) 128 129 listbox_T = tkinter.Listbox(root, width=8, height=19, selectmode="single") 130 listbox_T.bind("<<ListboxSelect>>", show_item_T) 131 for item in T_EV.keys(): 132 listbox_T.insert(tkinter.END, item) 133 listbox_T.place(x=180, y=40) 134 135root.mainloop()

投稿2019/07/19 00:32

magichan

総合スコア15898

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

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

退会済みユーザー

退会済みユーザー

2019/07/19 00:52

魔法使いさん 僕にとっては本当にmagicの様に見えます。 感動(完動)しました。 ジックリcodeの仕組みを勉強致します。 本当に感謝です。 有難うございました。
guest

0

おはようございます。

問題文読ませていただきました。

こんな感じでいかがでしょうか?

python

1from tkinter import * 2import tkinter 3 4if __name__ == "__main__": 5 6 F_EV = {"1.4": 1, "2": 2, "2.8": 3, "4": 4, "5.6": 5, 7 "8": 6, "11": 7, "16": 8, "22": 9, "32": 10} 8 9 T_EV = {"30": -5, "15": -4, "8": -3, "4": -2, "2": -1, "1": 0, "1/2": 1, "1/4": 2, "1/8": 3, "1/15": 4, "1/30": 5, 10 "1/60": 6, "1/125": 7, "1/250": 8, "1/500": 9, "1/1000": 10, "1/2000": 11, "1/4000": 12, "1/8000": 13} 11 12 # textbox_EVの値を更新する関数 13 def updateEv(): 14 # entry Widget : textbox_EVの値をリセットする。 15 textbox_EV.delete(0, tkinter.END) 16 # entry Widget : textbox_EVの値を更新する。 17 textbox_EV.insert(tkinter.END, int( 18 textbox_f.get()) + int(textbox_t.get())) 19 20 # listbox_Fが選択された場合に、label Widget : label_F, entry Widget : textbox_fの値を変更する関数 21 22 def show_item_F(event): 23 # リストボックスクリック時に、選択される要素idxを取得する。 24 itemIdx = listbox_F.curselection() 25 26 if len(itemIdx) >= 1: 27 # idxに該当するリストボックスの値を取得する。 28 text = listbox_F.get(itemIdx) 29 # label Widget : label_Fの値を更新する。 30 label_F["text"] = text 31 32 # entry Widget : textbox_fの値をリセットする。 33 textbox_f.delete(0, tkinter.END) 34 # entry Widget : textbox_fの値を更新する。 35 textbox_f.insert(tkinter.END, F_EV[text]) 36 37 updateEv() 38 39 # listbox_Tが選択された場合に、label Widget : label_T, entry Widget : textbox_tの値を変更する関数 40 def show_item_T(event): 41 # リストボックスクリック時に、選択される要素idxを取得する。 42 itemIdx = listbox_T.curselection() 43 44 if len(itemIdx) >= 1: 45 # idxに該当するリストボックスの値を取得する。 46 text = listbox_T.get(itemIdx) 47 # label Widget : label_Tの値を更新する。 48 label_T["text"] = text 49 50 # entry Widget : textbox_tの値をリセットする。 51 textbox_t.delete(0, tkinter.END) 52 # entry Widget : textbox_tの値を更新する。 53 textbox_t.insert(tkinter.END, T_EV[text]) 54 55 updateEv() 56 57 root = tkinter.Tk() 58 59 # Windowへタイトルをつける。 60 root.title("kumasanのEV計算機") 61 # Windowの画面サイズを設定する。 62 # geometryについて : https://kuroro.blog/python/rozH3S2CYE0a0nB3s2QL/ 63 root.geometry("270x400") 64 65 # Windowを親要素として、frame Widget(Frame)を作成する。 66 # Frameについて : https://kuroro.blog/python/P20XOidA5nh583fYRvxf/ 67 frame = tkinter.Frame(root) 68 # Windowを親要素として、frame Widget(Frame)をどのように表示するのか? 69 # gridについて : https://kuroro.blog/python/JoaowDiUdLAOj3cSBxiX/ 70 frame.grid() 71 72 # frame Widget(Frame)を親要素として、label Widgetを作成する。 73 # text : テキスト情報 74 # bg : 背景色の設定 75 # 色の設定を変更する場合 : http://www.tcl.tk/man/tcl/TkCmd/colors.htm 76 # Labelについて : https://kuroro.blog/python/Pj4Z7JBNRvcHZvtFqiKD/ 77 label_f = tkinter.Label(frame, text="Aperture", bg="lightblue") 78 # frame Widget(Frame)を親要素として、label Widgetをどのように表示するのか? 79 # gridについて : https://kuroro.blog/python/JoaowDiUdLAOj3cSBxiX/ 80 label_f.grid(column=0, row=0, sticky=tkinter.W+tkinter.E) 81 82 # frame Widget(Frame)を親要素として、listbox Widgetを作成する。 83 # selectmode : 選択できる項目の数の設定 84 # Listboxについて : https://kuroro.blog/python/XMWVRR2MEZAe4bpPDDXE/ 85 listbox_F = tkinter.Listbox(frame, selectmode="single") 86 # 第一引数 : イベント内容。listbox Widgetの値が選択された場合 87 # 第二引数 : 第一引数が試行された場合に、実行する関数名。show_item_Fとする。 88 # bindについて : https://kuroro.blog/python/eI5ApJE1wkU7bHsuwk0H/ 89 listbox_F.bind("<<ListboxSelect>>", show_item_F) 90 for item in ["1.4", "2", "2.8", "4", "5.6", "8", "11", "16", "22", "32"]: 91 listbox_F.insert(tkinter.END, item) 92 # frame Widget(Frame)を親要素として、listbox Widgetをどのように表示するのか? 93 # gridについて : https://kuroro.blog/python/JoaowDiUdLAOj3cSBxiX/ 94 listbox_F.grid(column=0, row=1) 95 96 # frame Widget(Frame)を親要素として、label Widgetを作成する。 97 # text : テキスト情報 98 # bg : 背景色の設定 99 # 色の設定を変更する場合 : http://www.tcl.tk/man/tcl/TkCmd/colors.htm 100 # Labelについて : https://kuroro.blog/python/Pj4Z7JBNRvcHZvtFqiKD/ 101 label_tso = tkinter.Label( 102 frame, text="Shutter Speed", bg="lightblue") 103 # frame Widget(Frame)を親要素として、label Widgetをどのように表示するのか? 104 # gridについて : https://kuroro.blog/python/JoaowDiUdLAOj3cSBxiX/ 105 label_tso.grid(column=1, row=0, sticky=tkinter.W+tkinter.E) 106 107 # frame Widget(Frame)を親要素として、listbox Widgetを作成する。 108 # selectmode : 選択できる項目の数の設定 109 # Listboxについて : https://kuroro.blog/python/XMWVRR2MEZAe4bpPDDXE/ 110 listbox_T = tkinter.Listbox(frame, selectmode="single") 111 # 第一引数 : イベント内容。listbox Widgetの値が選択された場合 112 # 第二引数 : 第一引数が試行された場合に、実行する関数名。show_item_Tとする。 113 # bindについて : https://kuroro.blog/python/eI5ApJE1wkU7bHsuwk0H/ 114 listbox_T.bind("<<ListboxSelect>>", show_item_T) 115 for item in ["30", "15", "8", "4", "2", "1", "1/2", "1/4", "1/8", "1/15", "1/30", 116 "1/60", "1/125", "1/250", "1/500", "1/1000", "1/2000", "1/4000", "1/8000"]: 117 listbox_T.insert(tkinter.END, item) 118 # frame Widget(Frame)を親要素として、listbox Widgetをどのように表示するのか? 119 # gridについて : https://kuroro.blog/python/JoaowDiUdLAOj3cSBxiX/ 120 listbox_T.grid(column=1, row=1) 121 122 # frame Widget(Frame)を親要素として、label Widgetを作成する。 123 # text : テキスト情報 124 # bg : 背景色の設定 125 # 色の設定を変更する場合 : http://www.tcl.tk/man/tcl/TkCmd/colors.htm 126 # Labelについて : https://kuroro.blog/python/Pj4Z7JBNRvcHZvtFqiKD/ 127 label_F = tkinter.Label(frame, text="show_F", bg="lightblue") 128 # frame Widget(Frame)を親要素として、label Widgetをどのように表示するのか? 129 # gridについて : https://kuroro.blog/python/JoaowDiUdLAOj3cSBxiX/ 130 label_F.grid(column=0, row=2, sticky=tkinter.W+tkinter.E) 131 132 # frame Widget(Frame)を親要素として、entry Widgetを作成する。 133 # Entryについて : https://kuroro.blog/python/PUZp77YFxrXvMCjpZbUg/ 134 textbox_f = tkinter.Entry(frame) 135 textbox_f.insert(tkinter.END, 0) 136 # frame Widget(Frame)を親要素として、entry Widgetをどのように表示するのか? 137 # gridについて : https://kuroro.blog/python/JoaowDiUdLAOj3cSBxiX/ 138 textbox_f.grid(column=0, row=3, sticky=tkinter.W+tkinter.E) 139 140 # frame Widget(Frame)を親要素として、label Widgetを作成する。 141 # text : テキスト情報 142 # bg : 背景色の設定 143 # 色の設定を変更する場合 : http://www.tcl.tk/man/tcl/TkCmd/colors.htm 144 # Labelについて : https://kuroro.blog/python/Pj4Z7JBNRvcHZvtFqiKD/ 145 label_T = tkinter.Label(frame, text="show_T", bg="lightblue") 146 # frame Widget(Frame)を親要素として、label Widgetをどのように表示するのか? 147 # gridについて : https://kuroro.blog/python/JoaowDiUdLAOj3cSBxiX/ 148 label_T.grid(column=1, row=2, sticky=tkinter.W+tkinter.E) 149 150 # frame Widget(Frame)を親要素として、entry Widgetを作成する。 151 # Entryについて : https://kuroro.blog/python/PUZp77YFxrXvMCjpZbUg/ 152 textbox_t = tkinter.Entry(frame) 153 textbox_t.insert(tkinter.END, 0) 154 # frame Widget(Frame)を親要素として、entry Widgetをどのように表示するのか? 155 # gridについて : https://kuroro.blog/python/JoaowDiUdLAOj3cSBxiX/ 156 textbox_t.grid(column=1, row=3, sticky=tkinter.W+tkinter.E) 157 158 # frame Widget(Frame)を親要素として、label Widgetを作成する。 159 # text : テキスト情報 160 # bg : 背景色の設定 161 # 色の設定を変更する場合 : http://www.tcl.tk/man/tcl/TkCmd/colors.htm 162 # Labelについて : https://kuroro.blog/python/Pj4Z7JBNRvcHZvtFqiKD/ 163 label_EV = tkinter.Label(frame, text="Total EV", bg="red") 164 # frame Widget(Frame)を親要素として、label Widgetをどのように表示するのか? 165 # gridについて : https://kuroro.blog/python/JoaowDiUdLAOj3cSBxiX/ 166 label_EV.grid(column=0, row=4, sticky=tkinter.W+tkinter.E) 167 168 # frame Widget(Frame)を親要素として、entry Widgetを作成する。 169 # Entryについて : https://kuroro.blog/python/PUZp77YFxrXvMCjpZbUg/ 170 textbox_EV = tkinter.Entry(frame) 171 textbox_EV.insert(tkinter.END, "Total EV") 172 # frame Widget(Frame)を親要素として、entry Widgetをどのように表示するのか? 173 # gridについて : https://kuroro.blog/python/JoaowDiUdLAOj3cSBxiX/ 174 textbox_EV.grid(column=0, row=5, sticky=tkinter.W+tkinter.E) 175 176# Windowをループさせて、継続的にWindow表示させる。 177# mainloopについて : https://kuroro.blog/python/DmJdUb50oAhmBteRa4fi/ 178root.mainloop()

ご確認のほど、よろしくお願いいたします。????‍♂️

投稿2021/06/11 00:59

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

まずはその2つのテキストボックスの内容を読めることを確認しましょう
内容を読んでただそれを表示するコードを書いてみてください

投稿2019/07/18 11:48

y_waiwai

総合スコア87774

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

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

退会済みユーザー

退会済みユーザー

2019/07/18 14:02

コメント有難うございます。 投稿したcodeで次にように整数になっていることは確認しております。 Fvは #print(type(F_EV[Fv])) # <--- int() Tvは  #print(T_EV[Tv]) この変数をglobalにして、外側の層(正式の言い方が分かりません)に持っていければ、後はただの計算なのでtryしましたが、私のレベルでは出来ませんでした。
退会済みユーザー

退会済みユーザー

2019/07/18 23:29

基本的なGlobalの使い方は知っており、前にやってみましたがうまく行きませんでした。  今のやり方は、リストから選ばれた数値に応じた明るさ値が辞書から選択・表示されます。 どなたかこのcodeを実装testをして見てもらえたら嬉しいです。 そうすれば私の言わんとしていることがお分かりいただけると思います。  そのうえでglobalの書き方を教えて頂ければ最高で~す。 宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問