2017-12-31 51 views
1

Das folgende Programm öffnet eine zweispaltige Datei und zeichnet eine Spalte als Funktion der anderen auf. Das Problem besteht darin, dass die tkinter-Widgets inaktiv sind, solange das Diagrammfenster geöffnet ist. Sie werden wieder aktiv, wenn das Diagrammfenster geschlossen wird. Ich möchte die Widgets aktiv halten. Wenn ich also eine andere Datei wähle, muss ich das Diagrammfenster nicht schließen. Wie kann das gemacht werden? Ich habe versucht, z.B. top.after(10, openfile) zu verwenden, aber das Programm fordert den Benutzer erwartungsgemäß auf, alle 10 ms eine neue Datei auszuwählen.Keeping tkinter panel aktiv, wenn das Plot geöffnet ist

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() 

Und das ist eine Beispieldatei mit denen ich arbeite:

.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

'nach' wird nicht funktionieren, weil' plt.show() 'blockiert Programm und' mainloop() 'kann' nach() 'nicht ausführen. Wie ich weiß, wurde 'plt.show()' nur zum schnellen Anzeigen von Bildern erstellt - d. zum Debuggen von Code. Wenn Sie Kontrolle haben wollen, können Sie [plot in tk window] einbetten (https://matplotlib.org/examples/user_interfaces/embedding_in_tk.html). – furas

+1

@Nae Ich habe gerade meine Frage bearbeitet – DenGor

+1

@Nae hinzugefügt eine andere Bearbeitung – DenGor

Antwort

0

Ich habe einige Änderungen vorgenommen, die Datei die Art und Weise Ich mag zu analysieren:

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() 

Der obige Code für arbeitet wie in ich ein anderes Beispiel grafische Darstellung der ziehen holen kann, während die gui bereits ausgeführt wird, auf :

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

standardmäßig matplotlib.pyplot.plot() blockiert, bis Sie das Fenster schließen. Dies unterbricht die mainloop, wodurch Ihre GUI nicht mehr reagiert.

Die Dokumentation zu matplotlib enthält eine example Anleitung zum Einbetten eines Plots in ein Tkinter-Fenster.

+0

danke für das Beispiel. Es kann in meinem Code implementiert werden. Ich habe jedoch immer noch keine richtige Sache: Wie kann ich die Handlung aktualisieren? Wenn das Programm einen zweiten Graphen plottet, erscheinen zwei Fenster, dann drei usw. 'canvas.get_tk_widget(). Destroy()' ist keine Lösung, da das Plot nicht aus dem Speicher entfernt wird. – DenGor

Verwandte Themen