Я проектирую графический интерфейс с PyQt
, где мне нужно отображать окно matplotlib/pylab, когда я нажимаю кнопку, которая делает график данных из созданной мной функции. Это похоже на время выполнения, используемое в Matlab. Я хочу, чтобы окно matplotlib/pylab было моим окном каждый раз, когда я нажимаю эту кнопку.Как рисовать на моем графическом интерфейсе
ответ
Эли Бендерский написал пример кода, который использует Matplotlib в PyQt: http://eli.thegreenplace.net/2009/01/20/matplotlib-with-pyqt-guis/
Интеграция Matplotlib с PyQt занимает немного работы. Вот пример: http://sourceforge.net/mailarchive/message.php?msg_id=29086544
Однако, есть несколько черчения библиотеки, разработанной специально вокруг PyQt:
Вот базовый пример, который будет отображать три разных примера, используя QThread
:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import random
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg
from matplotlib.figure import Figure
from PyQt4 import QtGui, QtCore
class MatplotlibWidget(QtGui.QWidget):
def __init__(self, parent=None):
super(MatplotlibWidget, self).__init__(parent)
self.figure = Figure()
self.canvas = FigureCanvasQTAgg(self.figure)
self.axis = self.figure.add_subplot(111)
self.layoutVertical = QtGui.QVBoxLayout(self)
self.layoutVertical.addWidget(self.canvas)
class ThreadSample(QtCore.QThread):
newSample = QtCore.pyqtSignal(list)
def __init__(self, parent=None):
super(ThreadSample, self).__init__(parent)
def run(self):
randomSample = random.sample(range(0, 10), 10)
self.newSample.emit(randomSample)
class MyWindow(QtGui.QWidget):
def __init__(self, parent=None):
super(MyWindow, self).__init__(parent)
self.pushButtonPlot = QtGui.QPushButton(self)
self.pushButtonPlot.setText("Plot")
self.pushButtonPlot.clicked.connect(self.on_pushButtonPlot_clicked)
self.matplotlibWidget = MatplotlibWidget(self)
self.layoutVertical = QtGui.QVBoxLayout(self)
self.layoutVertical.addWidget(self.pushButtonPlot)
self.layoutVertical.addWidget(self.matplotlibWidget)
self.threadSample = ThreadSample(self)
self.threadSample.newSample.connect(self.on_threadSample_newSample)
self.threadSample.finished.connect(self.on_threadSample_finished)
@QtCore.pyqtSlot()
def on_pushButtonPlot_clicked(self):
self.samples = 0
self.matplotlibWidget.axis.clear()
self.threadSample.start()
@QtCore.pyqtSlot(list)
def on_threadSample_newSample(self, sample):
self.matplotlibWidget.axis.plot(sample)
self.matplotlibWidget.canvas.draw()
@QtCore.pyqtSlot()
def on_threadSample_finished(self):
self.samples += 1
if self.samples <= 2:
self.threadSample.start()
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
app.setApplicationName('MyWindow')
main = MyWindow()
main.resize(666, 333)
main.show()
sys.exit(app.exec_())
Если я вас правильно понял вас есть приложение с графическим интерфейсом, и вы хотите, чтобы построить график в отдельном окне, чем GUI использует. pyqtgraph
может сделать это красиво.
первого типа pip install pyqtgraph
в командной строке, чтобы установить pyqtgraph
затем
import pyqtgraph as pg
pg.setConfigOption('background', 'w') # sets background to white
pg.setConfigOption('foreground', 'k') # sets axis color to black
pw = pg.plot(x, y, pen='g') # 1st plot (green)
pw.plot(x2, y2, pen='b') # 2nd plot in same figure (blue)
pw.setLabel('bottom', 'x-label') # x-label
pw.setLabel('left', 'y-label') # y-label
подробнее здесь: http://www.pyqtgraph.org/documentation/how_to_use.html
Это код из user1006989 (лучший ответ), адаптированный к PyQt5 , надеюсь, это будет полезно кому-то:
Вот простой пример, который будет строить три различных образцов с использованием QThread:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import random
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
from matplotlib.figure import Figure
from PyQt5 import QtCore #conda install pyqt
from PyQt5 import QtWidgets
class MatplotlibWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(MatplotlibWidget, self).__init__(parent)
self.figure = Figure()
self.canvas = FigureCanvasQTAgg(self.figure)
self.axis = self.figure.add_subplot(111)
self.layoutVertical = QtWidgets.QVBoxLayout(self)#QVBoxLayout
self.layoutVertical.addWidget(self.canvas)
class ThreadSample(QtCore.QThread):
newSample = QtCore.pyqtSignal(list)
def __init__(self, parent=None):
super(ThreadSample, self).__init__(parent)
def run(self):
randomSample = random.sample(range(0, 10), 10)
self.newSample.emit(randomSample)
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent=None):
super(MyWindow, self).__init__(parent)
self.pushButtonPlot = QtWidgets.QPushButton(self)
self.pushButtonPlot.setText("Plot")
self.pushButtonPlot.clicked.connect(self.on_pushButtonPlot_clicked)
self.matplotlibWidget = MatplotlibWidget(self)
self.layoutVertical = QtWidgets.QVBoxLayout(self)
self.layoutVertical.addWidget(self.pushButtonPlot)
self.layoutVertical.addWidget(self.matplotlibWidget)
self.threadSample = ThreadSample(self)
self.threadSample.newSample.connect(self.on_threadSample_newSample)
self.threadSample.finished.connect(self.on_threadSample_finished)
@QtCore.pyqtSlot()
def on_pushButtonPlot_clicked(self):
self.samples = 0
self.matplotlibWidget.axis.clear()
self.threadSample.start()
@QtCore.pyqtSlot(list)
def on_threadSample_newSample(self, sample):
self.matplotlibWidget.axis.plot(sample)
self.matplotlibWidget.canvas.draw()
@QtCore.pyqtSlot()
def on_threadSample_finished(self):
self.samples += 1
if self.samples <= 2:
self.threadSample.start()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
app.setApplicationName('MyWindow')
main = MyWindow()
main.resize(666, 333)
main.show()
sys.exit(app.exec_())
- 1. Как мне закодировать данные в моем графическом интерфейсе на Java?
- 2. Почему меню не отображается на моем графическом интерфейсе Tkinter?
- 3. О графическом интерфейсе на Java?
- 4. Как связать новую функцию в моем графическом интерфейсе Jbutton?
- 5. Как реализовать другой класс в моем графическом интерфейсе JavaFX?
- 6. Текстовый дисплей в графическом интерфейсе
- 7. MFC: Исправьте консоль на графическом интерфейсе
- 8. о графическом интерфейсе Matlab
- 9. Где находится сборщик репозитория в моем графическом интерфейсе Git?
- 10. Включая графику/фигуры в моем графическом интерфейсе Java
- 11. Почему я получаю неправильный формат даты в моем графическом интерфейсе?
- 12. Java не может заставить KeyListener работать в моем графическом интерфейсе
- 13. Завершить все QThreads на графическом интерфейсе Закрыть
- 14. Java. Почему мой образ не отображается в моем графическом интерфейсе
- 15. Отобразить вывод CMD в моем графическом интерфейсе (java)
- 16. Как сделать кнопку невидимой в графическом интерфейсе?
- 17. Ничего в моем графическом интерфейсе не отображается, кроме кнопок?
- 18. Что вызывает все эти ошибки в моем графическом интерфейсе?
- 19. Ошибки в моем графическом интерфейсе с помощью ActionListener
- 20. Невозможно отобразить групповой ящик в моем графическом интерфейсе Powershell
- 21. Воспроизвести видео на графическом интерфейсе python
- 22. Почему мой JSlider не отображается в моем графическом интерфейсе java?
- 23. Фоновый рисунок на графическом интерфейсе Jython
- 24. Динамически изменяемые размеры таблиц на графическом интерфейсе
- 25. NumberFormatException в многокадровом графическом интерфейсе
- 26. , используя Клей на графическом интерфейсе, java
- 27. PySide: «Динамическое» позиционирование кнопок на графическом интерфейсе?
- 28. Разбиение текста в графическом интерфейсе
- 29. Как отображать данные HashMap в графическом интерфейсе?
- 30. Создание приложения в графическом интерфейсе на Java
Вы генерации данных для построения внутри класса (с генератором случайных чисел). Возможно ли передавать данные извне. Что-то вроде этого: 'main = MyWindow (data)' – jonie83