前提・実現したいこと
Tkinterを用いて、ボタンを押したら3つの点からなるベクトルの角度の時間変化が表されたcsvデータが吐き出されるGUIを作成したいです。
発生している問題・エラーメッセージ
Exception in Tkinter callback Traceback (most recent call last): File "/usr/lib/python3.4/tkinter/__init__.py", line 1536, in __call__ return self.func(*args) File "/home/deepstation/PycharmProjects/tkinter/app.py", line 97, in button2_clicked rad[i] = np.arccos(cos) TypeError: 'builtin_function_or_method' object does not support item assignment
該当のソースコード
Python
1import ... 2 3#rootウィンドウを作成 4root = tk.Tk() 5 6# 参照ボタンのイベント 7# button1クリック時の処理 8def button1_clicked(): 9 fTyp = [("","*")] 10 iDir = os.path.abspath(os.path.dirname(__file__)) 11 dir = tk.filedialog.askdirectory(initialdir=iDir) 12 file1.set(dir) 13 14#参照ボタンの作成 15button1 = ttk.Button(root, text=u'参照', command=button1_clicked) 16button1.grid(row=1, column=3) 17 18# Frame1の作成 19frame1 = ttk.Frame(root, padding=10) 20frame1.grid() 21 22# ラベルの作成 23# 「ファイル」ラベルの作成 24s = StringVar() 25s.set('ファイル>>') 26label1 = ttk.Label(frame1, textvariable=s) 27label1.grid(row=1, column=1) 28 29# 参照ファイルパス表示ラベルの作成 30file1 = StringVar() 31file1_entry = ttk.Entry(frame1, textvariable=file1, width=50) 32file1_entry.grid(row=1, column=2) 33 34# button2クリック時の処理 35def button2_clicked(): 36 file2 = file1.get() 37 os.chdir(file2) 38 39 f = open("angle" + '.csv', 'w') 40 writer = csv.writer(f, lineterminator='\n') 41 42 # データをリストに保持 43 csvlist = [] 44 45 # データの読み込み 46 data1 = pd.read_csv('3.csv', engine='python', names=('X', 'Y', 'accurancy', 'NaN')) 47 data2 = pd.read_csv('2.csv', engine='python', names=('X', 'Y', 'accurancy', 'NaN')) 48 data3 = pd.read_csv('4.csv', engine='python', names=('X', 'Y', 'accurancy', 'NaN')) 49 data_r = data1.reset_index() 50 51 # データからある列を指定して取得 52 x1 = data1['X'] 53 y1 = data1['Y'] 54 x2 = data2['X'] 55 y2 = data2['Y'] 56 x3 = data3['X'] 57 y3 = data3['Y'] 58 59 # ラジアンの配列の初期化 60 rad = np.zeros() 61 62 end = len(data1) 63 64 # 各インデックスでのラジアンの計算 65 for i in range(end): 66 vec1 = np.array([x2[i] - x1[i], y2[i] - y1[i]]) 67 vec2 = np.array([x3[i] - x1[i], y3[i] - y1[i]]) 68 cos = np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2)) 69 rad[i] = np.arccos(cos) 70 deg = np.rad2deg(rad) 71 72 # 出力 73 output_dir = file2 74 csvlist = [deg] 75 csvlist = np.array(csvlist).T 76 writer.writerows(csvlist) 77 78 # ファイルクローズ 79 f.close() 80 81# Frame2の作成 82frame2 = ttk.Frame(root, padding=(0, 5)) 83frame2.grid(row=1) 84 85# Startボタンの作成 86button2 = ttk.Button(frame2, text='右肘', command=button2_clicked) 87button2.grid(row=2, column=2) 88 89#メインループ 90root.mainloop()
試したこと
for i in range(end): vec1 = np.array([x2[i] - x1[i], y2[i] - y1[i]]) vec2 = np.array([x3[i] - x1[i], y3[i] - y1[i]]) cos = np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2)) print(cos) rad[i] = np.arccos(cos) deg = np.rad2deg(rad)
と入力した結果-0.9993729797120076
とだけ表示されます。
おそらく組み込み関数内であるためにfor構文で行われている操作で数値の更新ができないのだと思います。組み込み関数単体では正常な結果が出ていることを確認しています。
組み込み関数内で繰り返し数値を計算しデータを追加していくにはどのようなコードを使えばよいのか、または書き方についてアドバイスをいただけると幸いです。
補足情報(FW/ツールのバージョンなど)
Python


回答1件
あなたの回答
tips
プレビュー