2016-03-07 8 views
1

Я реализую свою программу, используя пример scrollingplots предоставленный pyqtgraph здесь https://github.com/skycaptain/gazetrack/blob/master/gui/pyqtgraph/examples/scrollingPlots.pyФункциональная запуск и остановка в GUI с использованием PyQt или PySide для сбора данных в реальном масштабе времени с использованием pyqtgraph

import pyqtgraph as pg 
from pyqtgraph.Qt import QtCore, QtGui 
import numpy as np 

win = pg.GraphicsWindow() 
win.setWindowTitle('pyqtgraph example: Scrolling Plots') 
win.nextRow() 
p3 = win.addPlot() 
p4 = win.addPlot() 
# Use automatic downsampling and clipping to reduce the drawing load 
p3.setDownsampling(mode='peak') 
p4.setDownsampling(mode='peak') 
p3.setClipToView(True) 
p4.setClipToView(True) 
p3.setRange(xRange=[-100, 0]) 
p3.setLimits(xMax=0) 
curve3 = p3.plot() 
curve4 = p4.plot() 

data3 = np.empty(100) 
ptr3 = 0 

def update2(): 
    global data3, ptr3 
    data3[ptr3] = np.random.normal() 
    ptr3 += 1 
    if ptr3 >= data3.shape[0]: 
     tmp = data3 
     data3 = np.empty(data3.shape[0] * 2) 
     data3[:tmp.shape[0]] = tmp 
    curve3.setData(data3[:ptr3]) 
    curve3.setPos(-ptr3, 0) 
    curve4.setData(data3[:ptr3]) 

# update all plots 

timer = pg.QtCore.QTimer() 
timer.timeout.connect(update3) 
timer.start(50) 

## Start Qt event loop unless running in interactive mode or using pyside. 
if __name__ == '__main__': 
    import sys 
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): 
     QtGui.QApplication.instance().exec_() 

Сначала я хотел использовать Ctrl + C как сигнал, чтобы остановить непрерывную печать данных и сохранить данные, полученные в файл. Тем не менее, единственный способ выйти из программы - закрыть окно графика. Выполнение Ctrl + C в терминале ничего не делает.

Поэтому я хотел бы реализовать кнопку для запуска и остановки (и сохранения данных) в программе.

Как новичок в Python и объектно-ориентированное программирование, я искал примеры в Интернете. Я нашел примеры специально для реализации кнопки в графическом интерфейсе:

  • stackoverflow.com/questions/8762870/how-to-implement-a-simple-button-in-pyqt

  • группы. google.com/forum/#!topic/pyqtgraph/bxvZHtb1KKg

  • www.youtube.com/watch?v=z33vwdHrAFM и GUI связанные учебники по YouTuber

Ни один из примеры помогли мне в достижении того, чего я хочу, поскольку я не знаю, как их объединить с примером scrollingplots.

От Qt Ускоренный курс веб-страницы (pyqtgraph.org/documentation/qtcrashcourse.html):

from PyQt4 import QtGui # (the example applies equally well to PySide) 
import pyqtgraph as pg 

## Always start by initializing Qt (only once per application) 
app = QtGui.QApplication([]) 

## Define a top-level widget to hold everything 
w = QtGui.QWidget() 

## Create some widgets to be placed inside 
btn = QtGui.QPushButton('press me') 
text = QtGui.QLineEdit('enter text') 
listw = QtGui.QListWidget() 
plot = pg.PlotWidget() 

## Create a grid layout to manage the widgets size and position 
layout = QtGui.QGridLayout() 
w.setLayout(layout) 

## Add widgets to the layout in their proper positions 
layout.addWidget(btn, 0, 0) # button goes in upper-left 
layout.addWidget(text, 1, 0) # text edit goes in middle-left 
layout.addWidget(listw, 2, 0) # list widget goes in bottom-left 
layout.addWidget(plot, 0, 1, 3, 1) # plot goes on right side, spanning 3 rows 

## Display the widget as a new window 
w.show() 

## Start the Qt event loop 
app.exec_() 

Как будет app.exec_() в конце большинства кнопки примера кодов, и есть и цикл обновления в самом примере scrollingplot, я смущен тем, как они могут работать в одно и то же время.

Я где-то читал, что в отношении такого использования gui для непрерывного процесса я должен рассмотреть возможность использования таймера или многопоточности. Тем не менее, я в настоящее время не знаю никаких знаний в потоковом режиме.

Я даже пытался Tkinter, как я нашел руководство о том, как использовать Tkinter с Matplotlib -> pythonprogramming.net/how-to-embed-matplotlib-graph-tkinter-gui/

Будем рады получить любые советы по этой проблеме.

+0

Пожалуйста, добавьте stacktrace и код. Вы также можете посмотреть [Как спросить] (http://stackoverflow.com/help/how-to-ask), чтобы улучшить вопрос. Где именно эта проблема у вас есть? Вы также можете посмотреть [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve), чтобы улучшить вопрос. Добро пожаловать в SO! –

+0

Благодарим вас за ответ. Я добавил коды, которые я упомянул в сообщении. Проблема заключается в том, как многопоточность может быть реализована с использованием кода пикграфа для сбора данных в реальном времени и виджетов PyQt4. – jueeem

ответ

1
from PyQt4 import QtCore, QtGui 
import pyqtgraph as pg 

class MainForm(QtGui.QMainWindow): 
    def __init__(self): 
     super(MainForm, self).__init__() 
     self.playTimer = QtCore.QTimer() 
     self.playTimer.setInterval(500) 
     self.playTimer.timeout.connect(self.playTick) 
     self.toolbar = self.addToolBar("Play") 
     self.playScansAction = QtGui.QAction(QtGui.QIcon("control_play_blue.png"), "play scans", self) 
     self.playScansAction.triggered.connect(self.playScansPressed) 
     self.playScansAction.setCheckable(True) 
     self.toolbar.addAction(self.playScansAction) 

    def playScansPressed(self): 
     if self.playScansAction.isChecked(): 
      self.playTimer.start() 
     else: 
      self.playTimer.stop() 

    def playTick(self): 
     pass 

def main(): 
    app = QtGui.QApplication(sys.argv) 
    form = MainForm() 
    form.initUI("Scan Log Display") 
    form.show() 
    app.exec_() 

if __name__ == "__main__": 
    main() 

 Смежные вопросы

  • Нет связанных вопросов^_^