2017-05-31 5 views
3

Ich habe eine Python/Matplotlib-Anwendung, die häufig ein Diagramm mit neuen Daten aktualisiert, die von einem Messgerät kommen. Das Diagrammfenster sollte sich nicht von Hintergrund zu Vordergrund (oder umgekehrt) in Bezug auf andere Fenster auf meinem Desktop ändern, wenn das Diagramm mit neuen Daten aktualisiert wird.Wie man das Matplotlib (Python) Fenster im Hintergrund behält?

Dies funktioniert wie gewünscht mit Python 3 auf einem Rechner mit Ubuntu 16.10 mit Matplotlib 1.5.2rc. Auf einer anderen Maschine mit Ubuntu 17.04 und Matplotlib 2.0.0 erscheint das Figurenfenster jedoch jedes Mal nach vorne, wenn das Diagramm mit neuen Daten aktualisiert wird.

Wie kann ich das Vordergrund-/Hintergrundverhalten des Fensters steuern und den Fensterfokus beibehalten, wenn das Diagramm mit neuen Daten aktualisiert wird?

Hier ist ein Codebeispiel veranschaulicht meine Plotten Routine:

import matplotlib 
import matplotlib.pyplot as plt 
from time import time 
from random import random 

print (matplotlib.__version__) 

# set up the figure 
fig = plt.figure() 
plt.xlabel('Time') 
plt.ylabel('Value') 
plt.ion() 

# plot things while new data is generated: 
t0 = time() 
t = [] 
y = [] 
while True: 
    t.append(time()-t0) 
    y.append(random()) 
    fig.clear() 
    plt.plot(t , y) 
    plt.pause(1) 
+0

Als ich dies nicht in irgendeiner Weise testen, nur einen Vorschlag, was zu versuchen: statt 'plt.ion()', was passiert, wenn man 'plt.show (Block = False)' verwenden und dann in Ihre 'while' Schleife fügen Sie' plt.draw() 'direkt nach dem' plt.plot() 'Aufruf hinzu? –

+0

@Thomas Kühn: Danke für deinen Vorschlag. Das änderte nichts an der Ubuntu 17.04/matplotlib 2.0.0 Umgebung. – mbrennwa

+0

Was [Backend] (http://matplotlib.org/faq/usage_faq.html#what-is-a-backend) verwenden Sie? Es kann sich lohnen, dies zu ändern, um zu sehen, ob dies das Problem löst. –

Antwort

0

matplotlib wurde irgendwo von Version 1.5.2rc bis 2.0.0, so dass pyplot.show() bringt das Fenster in den Vordergrund geändert (siehe here) . Der Schlüssel ist daher, pyplot.show() in der Schleife zu vermeiden. Das gleiche gilt für pyplot.pause().

Unten ist ein funktionierendes Beispiel. Dadurch wird das Fenster am Anfang immer noch in den Vordergrund gebracht. Der Benutzer kann jedoch das Fenster in den Hintergrund bewegen, und das Fenster bleibt dort, wenn die Figur mit neuen Daten aktualisiert wird.

Beachten Sie, dass das Matplotlib-Animationsmodul eine gute Wahl ist, um die in diesem Beispiel gezeigte Grafik zu erstellen. Allerdings konnte ich die Animation nicht mit einem interaktiven Plot arbeiten, so dass die weitere Ausführung von anderem Code blockiert wird. Deshalb konnte ich das Animationsmodul nicht in meiner realen Anwendung verwenden.

import matplotlib 
matplotlib.use('TkAgg') 
import matplotlib.pyplot as plt 
import time 
from random import random 

print (matplotlib.__version__) 

# set up the figure 
plt.ion() 
fig = plt.figure() 
ax = plt.subplot(1,1,1) 
ax.set_xlabel('Time') 
ax.set_ylabel('Value') 
t = [] 
y = [] 
ax.plot(t , y , 'ko-' , markersize = 10) # add an empty line to the plot 
fig.show() # show the window (figure will be in foreground, but the user may move it to background) 

# plot things while new data is generated: 
# (avoid calling plt.show() and plt.pause() to prevent window popping to foreground) 
t0 = time.time() 
while True: 
    t.append(time.time()-t0) # add new x data value 
    y.append(random())  # add new y data value 
    ax.lines[0].set_data(t,y) # set plot data 
    ax.relim()     # recompute the data limits 
    ax.autoscale_view()   # automatic axis scaling 
    fig.canvas.flush_events() # update the plot and take care of window events (like resizing etc.) 
    time.sleep(1)    # wait for next loop iteration 
+0

Wenn Sie Probleme mit der Benutzeroberfläche haben, weil Sie 'time.sleep' verwenden und das Fenster nicht verschieben/skalieren können, werfen Sie einen Blick auf diese Antwort https: //stackoverflow.com/a/45734500/277267 was eine Art Wiedereinführung der 'plt.pause' Methode ist. –

Verwandte Themen