tkinterのキャンバス内にmatplotlibでグラフを作成しました.
グラフ上でクリックした場所に新たなプロットを追加できるようなプログラムを書きたいと考えています.
そのためにまずは,マウスでクリックした場所のグラフの座標を取得することを考えました.
def Click(event)でマウスの座標を取得できたのですが,関数の外で取得した値を使うことができません.
python
1import matplotlib.pyplot as plt 2from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 3import tkinter as tk 4 5x1 = [1,3,4,5] 6y1 = [2,4,6,9] 7 8fig = plt.figure() 9ax 10 = fig.add_subplot() 11ax.plot(x1, y1) 12 13 14def Click(event): 15 global x_val, y_val 16 x_val, y_val = (event.xdata, event.ydata) 17 print(x_val, y_val) ######こっちは正常に座標を出力してくれる####### 18 19 20root = tk.Tk() 21 22canvas = FigureCanvasTkAgg(fig, master=root) 23fig.canvas.mpl_connect("button_press_event", Click) 24canvas.draw() 25canvas.get_tk_widget().pack() 26 27print(x_val, y_val) #######エラーになる########## 28 29root.mainloop()
試したこと
上のコードを走らせるとx_value,y_valueに値が入っていないため,NameErrorになってしまいます.そこで例外処理をしました.エラーはなくなりましたが,やはり座標を取得してくれません.ループしていないことが原因ということは分かったのですが,どうすればよいのかわかりません
python
1import matplotlib.pyplot as plt 2from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 3import tkinter as tk 4 5x1 = [1,3,4,5] 6y1 = [2,4,6,9] 7 8fig = plt.figure() 9ax = fig.add_subplot() 10ax.plot(x1, y1) 11 12 13def Click(event): 14 global x_val, y_val 15 x_val, y_val = (event.xdata, event.ydata) 16 17root = tk.Tk() 18 19canvas = FigureCanvasTkAgg(fig, master=root) 20fig.canvas.mpl_connect("button_press_event", Click) 21canvas.draw() 22canvas.get_tk_widget().pack() 23 24#######変更部分######## 25try: 26 print(x_val, y_val) 27except NameError: 28 pass 29###################### 30 31root.mainloop()
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。