次のプログラムは、2列のファイルを開き、1つの列を別の列の関数としてプロットします。問題は、グラフウィンドウが開いている限り、tkinterウィジェットは非アクティブです。グラフウィンドウが閉じたときに再びアクティブになります。私はウィジェットをアクティブにしておきたいと思います。そのため、別のファイルを選択した場合、グラフウィンドウを閉じる必要はありません。これはどうすればできますか?私は、たとえばtop.after(10, openfile)
を使用しようとしましたが、プログラムは10ミリ秒ごとに新しいファイルを選択するように促しています。プロットが開いているときにtkinterパネルをアクティブにする
import tkinter as Tk
from tkinter.filedialog import askopenfilename
import matplotlib.pyplot as plt
top = Tk.Tk()
file_name = Tk.StringVar()
f = []
m = []
def openfile():
global opfi
opfi = askopenfilename()
def plot():
global opfi
del f[:], m[:]
with open(opfi, 'r') as file:
for line in range(6000):
g = file.readline().split('\t')
field = str(g[0])
magn = str(g[1])
f.append(eval(field))
m.append(eval(magn))
plt.close()
plt.plot(f, m, 'b')
plt.show()
b1 = Tk.Button(top, text='Sample', command=openfile, width=10)
b1.place(relx=0.0, rely=0.0)
b3 = Tk.Button(top, text='Plot', command=plot, width=6)
b3.place(relx=0.4, rely=0.0)
Tk.mainloop()
そして、この私が作業ファイルのサンプルです:あなたは、ウィンドウを閉じるまで、デフォルトで
.983983186936 -0.702925299281
1.00236660232 -0.726670144435
1.02074058078 -0.75169698959
1.03909297815 -0.777209834745
1.05744133036 -0.801262179899
1.0757541608 -0.826426525054
1.09406204943 -0.852315870209
1.11235780038 -0.876239715363
1.13063106929 -0.900676560518
1.14890298837 -0.926342905673
'plt.show()'はプログラムをブロックし、 'mainloop()'は 'after()'を実行できないため 'after'は動作しません。私が知っているように、 'plt.show()'は速い表示イメージにしか作成されませんでした。コードをデバッグします。あなたがコントロールしたいなら、あなたは[tkウィンドウにプロットを埋め込む]ことができます(https://matplotlib.org/examples/user_interfaces/embedding_in_tk.html)。 – furas
@Nae私はちょうど私の質問を編集しました – DenGor
@Naeは別の編集を追加しました – DenGor