Commit 2af2ac44 authored by Philipp Gast's avatar Philipp Gast
Browse files

renamed myWinQt* to examples

parent 209de922
#!/usr/bin/env python
# embedding_in_qt4.py --- Simple Qt4 application embedding matplotlib canvases
#
# Copyright (C) 2005 Florent Rougon
# 2006 Darren Dale
#
# This file is an example program for matplotlib. It may be used and
# modified with no restriction; raw copies as well as modified versions
# may be distributed without limitation.
# source: https://www.boxcontrol.net/embedding-matplotlib-plot-on-pyqt5-gui.html
from __future__ import unicode_literals
import sys
import os
import random
from matplotlib.backends import qt4_compat
use_pyside = qt4_compat.QT_API == qt4_compat.QT_API_PYSIDE
if use_pyside:
from PySide import QtGui, QtCore
else:
from PyQt4 import QtGui, QtCore
from numpy import arange, sin, pi
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
progname = os.path.basename(sys.argv[0])
progversion = "0.1"
class MyMplCanvas(FigureCanvas):
"""Ultimately, this is a QWidget (as well as a FigureCanvasAgg, etc.)."""
def __init__(self, parent=None, width=5, height=4, dpi=100):
fig = Figure(figsize=(width, height), dpi=dpi)
self.axes = fig.add_subplot(111)
# We want the axes cleared every time plot() is called
self.axes.hold(False)
self.compute_initial_figure()
#
FigureCanvas.__init__(self, fig)
self.setParent(parent)
FigureCanvas.setSizePolicy(self,
QtGui.QSizePolicy.Expanding,
QtGui.QSizePolicy.Expanding)
FigureCanvas.updateGeometry(self)
def compute_initial_figure(self):
pass
class MyStaticMplCanvas(MyMplCanvas):
"""Simple canvas with a sine plot."""
def compute_initial_figure(self):
t = arange(0.0, 3.0, 0.01)
s = sin(2*pi*t)
self.axes.plot(t, s)
#~ class MyDynamicMplCanvas(MyMplCanvas):
#~ """A canvas that updates itself every second with a new plot."""
#~ def __init__(self, *args, **kwargs):
#~ MyMplCanvas.__init__(self, *args, **kwargs)
#~ timer = QtCore.QTimer(self)
#~ timer.timeout.connect(self.update_figure)
#~ timer.start(1000)
#~
#~ def compute_initial_figure(self):
#~ self.axes.plot([0, 1, 2, 3], [1, 2, 0, 4], 'r')
#~
#~ def update_figure(self):
#~ # Build a list of 4 random integers between 0 and 10 (both inclusive)
#~ l = [random.randint(0, 10) for i in range(4)]
#~
#~ self.axes.plot([0, 1, 2, 3], l, 'r')
#~ self.draw()
class ApplicationWindow(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
self.setWindowTitle("application main window")
#~ self.file_menu = QtGui.QMenu('&File', self)
#~ self.file_menu.addAction('&Quit', self.fileQuit,
#~ QtCore.Qt.CTRL + QtCore.Qt.Key_Q)
#~ self.menuBar().addMenu(self.file_menu)
#~
#~ self.help_menu = QtGui.QMenu('&Help', self)
#~ self.menuBar().addSeparator()
#~ self.menuBar().addMenu(self.help_menu)
#~ self.help_menu.addAction('&About', self.about)
self.main_widget = QtGui.QWidget(self)
l = QtGui.QVBoxLayout(self.main_widget)
sc = MyStaticMplCanvas(self.main_widget, width=5, height=4, dpi=100)
#~ dc = MyDynamicMplCanvas(self.main_widget, width=5, height=4, dpi=100)
l.addWidget(sc)
#~ l.addWidget(dc)
self.main_widget.setFocus()
self.setCentralWidget(self.main_widget)
#~ self.statusBar().showMessage("All hail matplotlib!", 2000)
#~ def fileQuit(self):
#~ self.close()
#~ def closeEvent(self, ce):
#~ self.fileQuit()
#~ def about(self):
#~ QtGui.QMessageBox.about(self, "About",
#~ """embedding_in_qt4.py example
#~ Copyright 2005 Florent Rougon, 2006 Darren Dale
#~
#~ This program is a simple example of a Qt4 application embedding matplotlib
#~ canvases.
#~
#~ It may be used and modified with no restriction; raw copies as well as
#~ modified versions may be distributed without limitation."""
#~ )
qApp = QtGui.QApplication(sys.argv)
aw = ApplicationWindow()
aw.setWindowTitle("%s" % progname)
aw.show()
sys.exit(qApp.exec_())
#qApp.exec_()
# source: https://www.boxcontrol.net/embedding-matplotlib-plot-on-pyqt5-gui.html # embedding_in_qt5.py --- Simple Qt5 application embedding matplotlib canvases
#
# Copyright (C) 2005 Florent Rougon
# 2006 Darren Dale
# 2015 Jens H Nielsen
#
# This file is an example program for matplotlib. It may be used and
# modified with no restriction; raw copies as well as modified versions
# may be distributed without limitation.
#source: http://matplotlib.org/examples/user_interfaces/embedding_in_qt5.html
from __future__ import unicode_literals
import sys import sys
import os
import random import random
import matplotlib import matplotlib
matplotlib.use("Qt5Agg") # Make sure that we are using QT5
from PyQt5 import QtCore matplotlib.use('Qt5Agg')
from PyQt5.QtWidgets import QApplication, QMainWindow, QMenu, QVBoxLayout, QSizePolicy, QMessageBox, QWidget from PyQt5 import QtCore, QtWidgets
from numpy import arange, sin, pi from numpy import arange, sin, pi
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure from matplotlib.figure import Figure
progname = os.path.basename(sys.argv[0])
progversion = "0.1"
class MyMplCanvas(FigureCanvas): class MyMplCanvas(FigureCanvas):
"""Ultimately, this is a QWidget (as well as a FigureCanvasAgg, etc.).""" """Ultimately, this is a QWidget (as well as a FigureCanvasAgg, etc.)."""
def __init__(self, parent=None, width=5, height=4, dpi=100): def __init__(self, parent=None, width=5, height=4, dpi=100):
fig = Figure(figsize=(width, height), dpi=dpi) fig = Figure(figsize=(width, height), dpi=dpi)
self.axes = fig.add_subplot(111) self.axes = fig.add_subplot(111)
# We want the axes cleared every time plot() is called
self.axes.hold(False)
self.compute_initial_figure() self.compute_initial_figure()
#
FigureCanvas.__init__(self, fig) FigureCanvas.__init__(self, fig)
self.setParent(parent) self.setParent(parent)
FigureCanvas.setSizePolicy(self, FigureCanvas.setSizePolicy(self,
QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding,
QSizePolicy.Expanding) QtWidgets.QSizePolicy.Expanding)
FigureCanvas.updateGeometry(self) FigureCanvas.updateGeometry(self)
def compute_initial_figure(self): def compute_initial_figure(self):
pass pass
class MyStaticMplCanvas(MyMplCanvas): class MyStaticMplCanvas(MyMplCanvas):
"""Simple canvas with a sine plot.""" """Simple canvas with a sine plot."""
def compute_initial_figure(self): def compute_initial_figure(self):
t = arange(0.0, 3.0, 0.01) t = arange(0.0, 3.0, 0.01)
s = sin(2*pi*t) s = sin(2*pi*t)
...@@ -43,6 +59,7 @@ class MyStaticMplCanvas(MyMplCanvas): ...@@ -43,6 +59,7 @@ class MyStaticMplCanvas(MyMplCanvas):
class MyDynamicMplCanvas(MyMplCanvas): class MyDynamicMplCanvas(MyMplCanvas):
"""A canvas that updates itself every second with a new plot.""" """A canvas that updates itself every second with a new plot."""
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
MyMplCanvas.__init__(self, *args, **kwargs) MyMplCanvas.__init__(self, *args, **kwargs)
timer = QtCore.QTimer(self) timer = QtCore.QTimer(self)
...@@ -55,30 +72,31 @@ class MyDynamicMplCanvas(MyMplCanvas): ...@@ -55,30 +72,31 @@ class MyDynamicMplCanvas(MyMplCanvas):
def update_figure(self): def update_figure(self):
# Build a list of 4 random integers between 0 and 10 (both inclusive) # Build a list of 4 random integers between 0 and 10 (both inclusive)
l = [random.randint(0, 10) for i in range(4)] l = [random.randint(0, 10) for i in range(4)]
self.axes.cla()
self.axes.plot([0, 1, 2, 3], l, 'r') self.axes.plot([0, 1, 2, 3], l, 'r')
self.draw() self.draw()
class ApplicationWindow(QMainWindow):
class ApplicationWindow(QtWidgets.QMainWindow):
def __init__(self): def __init__(self):
QMainWindow.__init__(self) QtWidgets.QMainWindow.__init__(self)
self.setAttribute(QtCore.Qt.WA_DeleteOnClose) self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
self.setWindowTitle("application main window") self.setWindowTitle("application main window")
self.file_menu = QMenu('&File', self) self.file_menu = QtWidgets.QMenu('&File', self)
self.file_menu.addAction('&Quit', self.fileQuit, self.file_menu.addAction('&Quit', self.fileQuit,
QtCore.Qt.CTRL + QtCore.Qt.Key_Q) QtCore.Qt.CTRL + QtCore.Qt.Key_Q)
self.menuBar().addMenu(self.file_menu) self.menuBar().addMenu(self.file_menu)
self.help_menu = QMenu('&Help', self) self.help_menu = QtWidgets.QMenu('&Help', self)
self.menuBar().addSeparator() self.menuBar().addSeparator()
self.menuBar().addMenu(self.help_menu) self.menuBar().addMenu(self.help_menu)
self.help_menu.addAction('&About', self.about) self.help_menu.addAction('&About', self.about)
self.main_widget = QWidget(self) self.main_widget = QtWidgets.QWidget(self)
l = QVBoxLayout(self.main_widget) l = QtWidgets.QVBoxLayout(self.main_widget)
sc = MyStaticMplCanvas(self.main_widget, width=5, height=4, dpi=100) sc = MyStaticMplCanvas(self.main_widget, width=5, height=4, dpi=100)
dc = MyDynamicMplCanvas(self.main_widget, width=5, height=4, dpi=100) dc = MyDynamicMplCanvas(self.main_widget, width=5, height=4, dpi=100)
l.addWidget(sc) l.addWidget(sc)
...@@ -96,25 +114,25 @@ class ApplicationWindow(QMainWindow): ...@@ -96,25 +114,25 @@ class ApplicationWindow(QMainWindow):
self.fileQuit() self.fileQuit()
def about(self): def about(self):
QMessageBox.about(self, "About", QtWidgets.QMessageBox.about(self, "About",
"""embedding_in_qt5.py example """embedding_in_qt5.py example
Copyright 2015 BoxControL Copyright 2005 Florent Rougon, 2006 Darren Dale, 2015 Jens H Nielsen
This program is a simple example of a Qt5 application embedding matplotlib This program is a simple example of a Qt5 application embedding matplotlib
canvases. It is base on example from matplolib documentation, and initially was canvases.
developed from Florent Rougon and Darren Dale.
It may be used and modified with no restriction; raw copies as well as
http://matplotlib.org/examples/user_interfaces/embedding_in_qt4.html modified versions may be distributed without limitation.
It may be used and modified with no restriction; raw copies as well as This is modified from the embedding in qt4 example to show the difference
modified versions may be distributed without limitation.""" between qt4 and qt5"""
) )
if __name__ == '__main__':
app = QApplication(sys.argv) qApp = QtWidgets.QApplication(sys.argv)
aw = ApplicationWindow() aw = ApplicationWindow()
aw.setWindowTitle("PyQt5 Matplot Example") aw.setWindowTitle("%s" % progname)
aw.show() aw.show()
#sys.exit(qApp.exec_()) sys.exit(qApp.exec_())
app.exec_() #qApp.exec_()
#!/usr/bin/env python #!/usr/bin/python
# -*- coding: utf-8 -*-
# embedding_in_qt4.py --- Simple Qt4 application embedding matplotlib canvases
# #
# Copyright (C) 2005 Florent Rougon # ================= FILE HEADER ========================================
# 2006 Darren Dale
# #
# This file is an example program for matplotlib. It may be used and # myplotlib v3.0.1,
# modified with no restriction; raw copies as well as modified versions #
# may be distributed without limitation. # @file myWin_Qt4Agg.py
# source: https://www.boxcontrol.net/embedding-matplotlib-plot-on-pyqt5-gui.html # @author Yori 'AGy' Fournier
# @licence CC-BY-SA
#
from __future__ import unicode_literals # MyWin_Qt4Agg class: Overlay of matplotlib FigureManager
import sys # class. It allows a cleaner and more confortable
import os # usage of windows.
import random #
# @Class MyWin
#
# @Constructor
#
# fig: the MyFig object that need to be drawn
# show: a flag to show the window just after
# creation. (default: True)
# fignum: number of both the Window and the Figure.
# debug: flag for debugging, more verbatile.
# (kw)args: user defined arguments and keywords.
#
# @section Functions
#
# - _boundFigure_: bound a figure to the window (priv.)
#
# - _unboundFigure_: unbound a figure to the window (priv.)
#
# - set_figure: a clean way of setting a new figure
# to the window.
#
# - refresh: redraw the window
# - clean the figure
# - plot the figure
# - draw the canvas
#
# - drawFigure: draw a given figure on the window
# - set the figure of needed
# - refresh
#
# - close: close the window
#
# ======================================================================
#
# IMPORT ---------------------------------------------------------------
from . import INFO, SEVR, WARN, DBUG, SPCE
from . import rcParams
from . import _G_WINDOWS
from . import np
#~ from matplotlib.backends.backend_gtkagg import FigureManagerGTKAgg, FigureCanvasGTKAgg
# For the QtAgg backend
from matplotlib.backends import qt4_compat from matplotlib.backends import qt4_compat
use_pyside = qt4_compat.QT_API == qt4_compat.QT_API_PYSIDE use_pyside = qt4_compat.QT_API == qt4_compat.QT_API_PYSIDE
if use_pyside: if use_pyside:
from PySide import QtGui, QtCore from PySide import QtGui, QtCore
else: else:
from PyQt4 import QtGui, QtCore from PyQt4 import QtGui, QtCore
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg
from numpy import arange, sin, pi
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure # Class MyWin Overwriting the disgusting Matplotlib.FigureManager class
class MyWin_GTKAgg(FigureCanvasQTAgg):
progname = os.path.basename(sys.argv[0])
progversion = "0.1" # CONSTRUCTOR ------------------------------------------------------
def __init__(self, fig, show=True, *args, **kwargs):
class MyMplCanvas(FigureCanvas): # set the dpi to 75 (correct value for screen)
"""Ultimately, this is a QWidget (as well as a FigureCanvasAgg, etc.).""" if(fig.dpi != 75.):
def __init__(self, parent=None, width=5, height=4, dpi=100): fig.dpi = 75.
fig = Figure(figsize=(width, height), dpi=dpi)
self.axes = fig.add_subplot(111) # Get the debug value
# We want the axes cleared every time plot() is called debug = kwargs.get('debug', False)
self.axes.hold(False)
# Get the user specified ID of the window or set it to 0
self.compute_initial_figure() if 'fignum' in kwargs.keys():
num = kwargs['fignum']
# fignumSpecifiedByUser = True
FigureCanvas.__init__(self, fig) else:
num = 0
fignumSpecifiedByUser = False
# if ID already used
if(num in [(window.num) for window in _G_WINDOWS]):
# if user specified fignum then close former window and create new one
if(fignumSpecifiedByUser):
if(debug):
print(DBUG + "The fignum you specified already exists, I'll close the former window")
# Close the window with the specified number
_G_WINDOWS[np.where([(window.num == num) for window in _G_WINDOWS])[0][0]].close()
else:
# If user didn't specified a fignum
# increase ID until found a free one
while(num in [(window.num) for window in _G_WINDOWS]):
num = num + 1
# If debug print the ID of the window
if(debug):
print(DBUG + "You choosed num = " + str(num))
# before creating anything verify that the fig is not already
# bounded to another window
if fig.boundedToWin:
# if it is the case close the bounded window.
win = _G_WINDOWS[np.where([(window.num == fig.fignum) for window in _G_WINDOWS])[0][0]]
win.close()
# Call FigureManagerGTK class
# (already wondering if this is not a mistake...)
if(debug):
print(INFO + "Used GTKAgg backend.")
# create the canvas
FigureCanvasQTAgg.__init__(self, fig)
self.setParent(parent) self.setParent(parent)
FigureCanvas.setSizePolicy(self, FigureCanvasQTAgg.setSizePolicy(self,
QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding,
QtGui.QSizePolicy.Expanding) QtGui.QSizePolicy.Expanding)
FigureCanvas.updateGeometry(self) FigureCanvasQTAgg.updateGeometry(self)
def compute_initial_figure(self): # bound the figure to the window
pass self.canvas.figure.boundedToWin = True
self.canvas.figure.fignum = num
class MyStaticMplCanvas(MyMplCanvas): # add the window in the global variable _G_WINDOWS
"""Simple canvas with a sine plot.""" # this guarenty that you never loose a window
def compute_initial_figure(self): # (see myTool.py getWindow(num))
t = arange(0.0, 3.0, 0.01) _G_WINDOWS.append(self)
s = sin(2*pi*t)
self.axes.plot(t, s) # if show is on, then show the window
if show:
# For GTKAgg and TKAgg ---------------------------------
class MyDynamicMplCanvas(MyMplCanvas): self.refresh()
"""A canvas that updates itself every second with a new plot.""" self.show()
def __init__(self, *args, **kwargs):
MyMplCanvas.__init__(self, *args, **kwargs)
timer = QtCore.QTimer(self) # BOUND ------------------------------------------------------------
timer.timeout.connect(self.update_figure) def _boundFigure_(self, fig):
timer.start(1000)
fig.canvas = self.canvas
def compute_initial_figure(self): self.canvas.figure = fig
self.axes.plot([0, 1, 2, 3], [1, 2, 0, 4], 'r') self.canvas.figure.boundedToWin = True
self.canvas.figure.fignum = self.num
def update_figure(self):
# Build a list of 4 random integers between 0 and 10 (both inclusive)
l = [random.randint(0, 10) for i in range(4)] # UNBOUND ----------------------------------------------------------
def _unboundFigure_(self):
self.axes.plot([0, 1, 2, 3], l, 'r')
self.draw() self.canvas.figure.boundedToWin = False
self.canvas.figure.fignum = -1
class ApplicationWindow(QtGui.QMainWindow):
def __init__(self): # SETTERS ----------------------------------------------------------
QtGui.QMainWindow.__init__(self) # SET FIGURE -------------------------------------------------------
self.setAttribute(QtCore.Qt.WA_DeleteOnClose) def set_figure(self, fig):
self.setWindowTitle("application main window")
# first unbound the former figure
self.file_menu = QtGui.QMenu('&File', self) self._unboundFigure_()
self.file_menu.addAction('&Quit', self.fileQuit,
QtCore.Qt.CTRL + QtCore.Qt.Key_Q) # if the new figure is already bounded close
self.menuBar().addMenu(self.file_menu) # its former container.
if fig.boundedToWin:
self.help_menu = QtGui.QMenu('&Help', self) win = _G_WINDOWS[np.where([(window.num == fig.fignum) for window in _G_WINDOWS])[0][0]]
self.menuBar().addSeparator() win.close()
self.menuBar().addMenu(self.help_menu)
# bound the new figure
self.help_menu.addAction('&About', self.about) self._boundFigure_(fig)
self.main_widget = QtGui.QWidget(self)
# REFRESH ----------------------------------------------------------
l = QtGui.QVBoxLayout(self.main_widget) def refresh(self):
sc = MyStaticMplCanvas(self.main_widget, width=5, height=4, dpi=100)
dc = MyDynamicMplCanvas(self.main_widget, width=5, height=4, dpi=100) # in the case the figure got another canvas
l.addWidget(sc) # rebound the figure. This situation should not happend!!
l.addWidget(dc) if self.canvas != self.canvas.figure.canvas:
print(WARN + "Something weird happend, the canvas of the figure have been changed")
self.main_widget.setFocus() self.set_figure(self.canvas.figure)
self.setCentralWidget(self.main_widget)
# refresh
self.statusBar().showMessage("All hail matplotlib!", 2000) self.canvas.figure.plot()
self.canvas.draw()
def fileQuit(self):
self.close() return(True)
def closeEvent(self, ce):