2017-12-31 222 views
1

次のプログラムは、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 
+0

'plt.show()'はプログラムをブロックし、 'mainloop()'は 'after()'を実行できないため 'after'は動作しません。私が知っているように、 'plt.show()'は速い表示イメージにしか作成されませんでした。コードをデバッグします。あなたがコントロールしたいなら、あなたは[tkウィンドウにプロットを埋め込む]ことができます(https://matplotlib.org/examples/user_interfaces/embedding_in_tk.html)。 – furas

+1

@Nae私はちょうど私の質問を編集しました – DenGor

+1

@Naeは別の編集を追加しました – DenGor

答えて

0

私はファイル私が好きなように解析するためにいくつかの変更を行いました。

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: 
     g = file.readlines()    # to read unknown number of lines. 
    for line_n, line in enumerate(g):  # make '1.00236660232 -0.726670144435\n' 
     g[line_n] = line.strip().split() # [1.00236660232, -0.726670144435] 
     f.append(float(g[line_n][0]))  # 1.00236660232 
     m.append(float(g[line_n][1]))  # -0.726670144435 

    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) 

top.mainloop() 

のように私は、GUIがすでに実行されている間のグラフを描画するために、別のサンプルを選ぶことができるため、上記のコードは動作します:

C:\Users\user>python 
Python 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] 
on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import tkinter as tk 
>>> tk.TkVersion 
8.6 
>>> 
0

matplotlib.pyplot.plot()ブロック。これにより、mainloopが中断され、GUIが応答しなくなります。

matplotlibのドキュメントには、exampleのTkinterウィンドウにプロットを埋め込む方法があります。

+0

ありがとうございます。私のコードで実装することができます。私はまだ、しかし、1つのことが正しくない:私はどのようにプロットを更新することができますか?プログラムが2番目のグラフをプロットすると、2つのウィンドウが表示され、次に3つのウィンドウなどが表示されます。 'canvas.get_tk_widget()。destroy()'はプロットがメモリから削除されないため解決策ではありません。 – DenGor

関連する問題