前提・実現したいこと
tkinter上に読み込んだcsvファイルを表示させ、グラフ上で、マウスの右クリックで最小二乗法したい範囲を選択し、左ダブルクリックで最小二乗法の線を引く。これを二回行い、二本の最小二乗法の線を引いた後、tkinter上に表示される"交点"というボタンを押すと二本の最小二乗法の交点の部分に点を打つというプログラムを作成したいと考えております。
tkinter上にグラフを表示させ、マウス操作を行い、ボタンを設置するところはできたのですが、ボタンを押しても交点に点を打てず、下記のようなエラーメッセージが出ます。このエラーメッセージの解決方法がわからず、悩んでおります。
発生している問題・エラーメッセージ
can't invoke "update" command: application has been destroyed
該当のソースコード
python
1from tkinter import * 2from matplotlib import pyplot as plt 3from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 4import numpy as np 5from scipy import optimize 6import pylab 7import turtle 8import tkinter as tk 9 10x_data = [] 11y_data = [] 12katamuki = [] 13seppen = [] 14state = 0 15f = open('xrr_data.csv', 'r') 16 17datalist = f.readlines() 18for data in datalist: 19 if state == 1: 20 x_data.append(float(data.split(',')[0])) 21 y_data.append(float(data.split(',')[1])) 22 if "Angle,Intensity" in data: 23 state =1 24 25f.close() 26xdata = np.array(x_data) 27ydata = np.array(y_data) 28 29 30def drawlsm(lind,rind): 31 32 global xdata2 33 global ydata2 34 35 xdata2 = xdata[lind:rind] 36 ydata2 = ydata[lind:rind] 37 38 parameter0 = [0.,0.] 39 result = optimize.leastsq(fit_func,parameter0,args=(xdata2,ydata2)) 40 print(result) 41 a_fit=result[0][0] 42 b_fit=result[0][1] 43 print(a_fit,b_fit) 44 plt.plot(xdata,a_fit*xdata+b_fit,'k-', label='fitted line', linewidth=3, alpha=0.3) 45 46 47#Least squares method with scipy.optimize 48def fit_func(parameter,x,y): 49 a = parameter[0] 50 b = parameter[1] 51 residual = y-(a*x+b) 52 return residual 53 54def oncmask(event): 55 56 global stat 57 global leftind, rightind 58 59 ind=np.searchsorted(xdata,event.xdata) 60 plt.title("You clicked index="+str(ind)) 61 if event.button==3 and stat==1: 62 leftind=ind 63 ax.plot([xdata[ind]],[ydata[ind]],".",color="red") 64 stat=2 65 elif event.button==3 and stat==2: 66 rightind=ind 67 ax.plot(xdata[leftind:rightind],ydata[leftind:rightind],color="red") 68 stat=3 69 print (leftind, rightind) 70 elif event.button==1 and event.dblclick==1 and stat==3: 71 plt.title("Approved") 72 mask[leftind:rightind]=False 73 drawlsm(leftind,rightind) 74 stat=1 75 elif event.button==2 and stat==3: 76 plt.title("Canceled") 77 ax.plot(xdata[leftind:rightind],ydata[leftind:rightind],color="blue") 78 ax.plot([xdata[leftind]],[ydata[leftind]],".",color="green") 79 stat=1 80 fig.canvas.draw() 81 82katamuki2 = np.array(katamuki) 83seppen2 = np.array(seppen) 84 85 86def getintersection():#一番最後とその1つ前に引いた線の交点をget 87 global xa #交点x座標 88 indent = len(katamuki2)#傾きリストの要素数 89 indent2= len(seppen2)#切片のリストの要素数 90 print("傾きリストの要素数={}, 切片リストの要素数={}".format(indent,indent2)) 91 #xa求める 92 xa=(seppen2[indent2-1]-seppen2[indent2-2])/(katamuki2[indent-2]-katamuki2[indent-1])#(b1-b0)/(a0-a1) 93 print("交点座標={}".format(xa)) 94 ya=katamuki2[indent-1]*xa+seppen2[indent2-1]#x座標からy座標を求める 95 plt.plot(xa,ya,".",color="m")#交点プロット 96 plt.show() 97 fig.canvas.draw() 98 99#x=np.arange(0, 10, 0.1) 100#y= np.random.rand(100) 101 102mask=np.ones(len(xdata),dtype=bool) 103 104stat = 1 105fig=plt.figure() 106ax=fig.add_subplot(111) 107ax.plot(xdata,ydata) 108 109# Windowの設定 110root = Tk() 111root.title("Plot window") 112root.geometry() 113 114# Frameの設定 115frame_1 = Frame(root, bd=4, relief=GROOVE) 116frame_2 = Frame(root, bd=4, relief=GROOVE) 117 118# widgetの設定 119btn2 = Button(frame_1,text='交点',font=("",18),command=getintersection) 120canvas = FigureCanvasTkAgg(fig, frame_2)#figをcanvasにのっける 121 122# widgetの配置 123frame_1.grid(row=0, column=0, sticky=W + E) 124frame_2.grid(row=1, column=0) 125btn2.pack(fill=X) 126canvas.get_tk_widget().grid(row=0, column=0) 127 128cid = fig.canvas.mpl_connect('button_press_event', oncmask) 129 130canvas.start_event_loop() 131
試したこと
ボタンを押したときにtkinterを終了するプログラムを作成して試してみたところ、tkinterの終了はできましたが同じエラーメッセージが出ました。
補足情報(FW/ツールのバージョンなど)
Python初心者で、説明不足や至らない点があると思いますが、アドバイス頂けたら嬉しいです。
よろしくお願いします。
"追記"
excelデータはこのようになっております。
列1 | 列2 |
---|---|
Angle | Intensity |
0.027 | 879036 |
0.029 | 838848 |
0.031 | 766020 |
0.033 | 745008 |
0.035 | 714204 |
0.037 | 695844 |
0.039 | 677280 |
0.041 | 656268 |
0.043 | 628116 |
0.045 | 661164 |
0.047 | 649332 |
0.049 | 651984 |
0.051 | 640560 |
0.053 | 631788 |
0.055 | 647496 |
0.057 | 643620 |
0.059 | 656064 |
0.061 | 641988 |
0.063 | 668916 |
0.065 | 663000 |
0.067 | 671160 |
0.069 | 661164 |
0.071 | 680136 |
0.073 | 666876 |
0.075 | 691560 |
0.077 | 681564 |
0.079 | 712368 |
0.081 | 706656 |
0.083 | 744600 |
0.085 | 720732 |
0.087 | 740520 |
0.089 | 750108 |
0.091 | 745008 |
0.093 | 754800 |
0.095 | 776832 |
0.097 | 777240 |
0.099 | 778260 |
0.101 | 778260 |
0.103 | 795396 |
0.105 | 810492 |
0.107 | 812124 |
0.109 | 813960 |
0.111 | 812532 |
0.113 | 807636 |
0.115 | 838440 |
回答1件
あなたの回答
tips
プレビュー