0

ポイントのセットをプロットし、プロットを Tkinter キャンバスに埋め込みました。私がやろうとしているのは、1 つまたは複数のポイントをクリックしたときに座標を取得することです。次のコードを使用してそれを行うことができました(Tkinterに埋め込む前)。ただし、反復の最初のプロットでのみ機能します。次の 2 つのプロットに拡張するにはどうすればよいですか? キャンバスを使用して変更を行う必要があることを誰か説明してもらえますか?

outl=[]
index = []
list_rep = []
def on_pick(event):
        thisline = event.artist
        xdata, ydata = thisline.get_data()
        tmp = []

        index.append(i)
        ind = event.ind
        tmp.append(list(xdata[ind])[0])
        tmp.append(list(ydata[ind])[0])
        outl.append(tmp)


        #print('on pick line:', zip(xdata[ind], ydata[ind]))

new_ydata1 = []
new_ydata2 = []
new_ydata3 = []
for i in range(3):
        root = Tk.Tk()
        root.wm_title("Embed in Tk")

        ydata1 = np.array(Max_Correct_1[i])
        ydata2 = np.array(Max_Correct_2[i])
        ydata3 = np.array(Max_Correct_3[i])

        Aveg=np.array(Avg[i])


        f = Figure(figsize=(5,4), dpi=100)
        ax1 = f.add_subplot(111)

        ax1.axis([-9.5,-4.0,-10,105])
        ax1.plot(Log_Values_Array,ydata1,'o',picker=7)
        ax1.plot(Log_Values_Array,ydata2,'*',picker=7)
        ax1.plot(Log_Values_Array,ydata3,'^',picker=7)
        ax1.plot(Log_Values_Array,Aveg,'b--')

        canvas = FigureCanvasTkAgg(f, master=root)

        canvas.show()
        canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)


        canvas._tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)

        canvas.mpl_connect('pick_event',on_pick)




        print outl



        canvas.get_tk_widget().delete("all")
        outl=[]
        index = []
        Tk.mainloop()
4

1 に答える 1

1

Tkこれは、ループを使用して複数のインスタンスを作成しようとしていて、それぞれを呼び出そうとしていることと関係があると思いますmainloop。特定のアプリケーションには1 つのみ存在する必要があるTkため、mainloopその 1 つのインスタンスのみを呼び出します。

ループに入る前に、そのルートTkインスタンスを作成します。ループに入ったら、ウィジェットを使用して、各プロット ウィンドウをそのルートの子として作成します。ループが終了したら、ルートを呼び出します。forTopLevelmainloop

動作するはずの非常に大まかなコードの概要を次に示します。

# Code before loop just as it is, except you create your root Tk instance here...
root = Tk.Tk()

# Now start the loop
for i in range(3):
    win = Tk.TopLevel(root)
    win.title(text="Embed in Tk")
    ...
    # The rest of your plot-building code goes here, with all new widgets
    # as children of the window "win"

# Now that the loop is finished, call mainloop
root.mainloop()

データ (および使用している他のモジュール) にアクセスできないと、これが必要なものに対して機能するかどうかを確認するのは困難ですが、うまくいくはずです。

さらに効果的に作業するには、プロット ウィンドウごとにクラスを作成し ( サブクラス化TopLevel)、ループを使用して 3 つのインスタンスを作成し、各インスタンスに適切なデータを渡すことを検討してください。そうすれば、各プロットのウィンドウと操作を分離できます。

于 2013-06-13T22:07:57.387 に答える