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

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

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

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

Python

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

Q&A

解決済

1回答

3962閲覧

組み込み関数内で繰り返し作業がストップしてしまう

退会済みユーザー

退会済みユーザー

総合スコア0

Tkinter

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

Python

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

0グッド

1クリップ

投稿2019/03/01 04:57

編集2019/03/01 05:58

前提・実現したいこと

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

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

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

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

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

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

t_obara

2019/03/01 05:11

そもそもtkinterは関係なく、pythonの文法や使い方に問題があるのではないでしょうか。まずはbutton2_clicked関数内部のコードを単体で動作させるようにして、必要なコードだけにして試してみてはいかがでしょうか。 np.zerosの使い方や配列そのものの理解もあまりできていないように見受けられます。
退会済みユーザー

退会済みユーザー

2019/03/01 05:20

ありがとうございます。記載したように、内部のコード単体では正常に動作することをすでに確認しております。
guest

回答1

0

ベストアンサー

これで通るかは確認できていないのですが...

ここを

python

1# button2クリック時の処理 2def button2_clicked(): 3 ... 4 5 # ラジアンの配列の初期化 6 rad = np.zeros 7 8 end = len(data1)

このように書き換えて見てください。

python

1# button2クリック時の処理 2def button2_clicked(): 3 ... 4 5 # ラジアンの配列の初期化 6 end = len(data1) 7 8 rad = np.zeros(end)

背景

エラーメッセージから、なんとなく、代入してはいけないところで代入している気配があります。

TypeError: 'builtin_function_or_method' object does not support item assignment

exception AttributeError
属性参照 (属性参照 を参照) や代入が失敗した場合に送出されます (オブジェクトが属性の参照や属性の代入をまったくサポートしていない場合には TypeError が送出されます)。

np.zeros

確認してみると numpy.zeros はメソッドで引数を渡さないといけないことがわかりました。

numpy.zeros(shape, dtype=float, order='C')

shape : int or tuple of ints
Shape of the new array, e.g., (2, 3) or 2.

投稿2019/03/01 06:10

nico25

総合スコア830

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

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

退会済みユーザー

退会済みユーザー

2019/03/01 06:19

綺麗に解決しました!ありがとうございました!
nico25

2019/03/01 06:23

恐れいります!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問