2015-01-21 10 views
1

내 우분투 (14.04) OS에서 원시 마우스 데이터를 파이썬으로 처리하는 서사시 투쟁 중에 여기서 많은 도움을 얻었습니다. 다시 붙어 있습니다. 나는 pyqtgraph의 "쉬운"것을 이해하는 것이 매우 어려워 보인다. 내가하고 싶은 건 내가 시작/일시 정지/중지 버튼, 숫자를 보여줄 목록 위젯, 그리고 내가 무슨 일이 일어나는지 볼 수있는 줄거리가있는 멋진 작은 GUI로 코드를 래핑하는 것이다. 나는 나를 위해 주요한 문제를 짐작한다. 나는 pyqt에서이 모든 사건을 아주 잘 이해하고있다. 내가 창은 정지하고 아무 일도 발생하지 않습니다, 시작 버튼을 누르면pyqtgraph가있는 Python 실시간 mousedata

#!/usr/bin/python 
import threading 
import struct 
import time 
import numpy as np 

from PyQt4 import QtGui # (the example applies equally well to PySide) 
from PyQt4 import QtCore 
import pyqtgraph as pg 
## 
data =[(0,0)] 
sum_data = [(0,0)] 
file = open("/dev/input/mouse2", "rb") 

def getMouseEvent(): 
    buf = file.read(3); 
    #python 2 & 3 compatibility 
    button = buf[0] if isinstance(buf[0], int) else ord(buf[0]) 
    x,y = struct.unpack("bb", buf[1:]); 
    print x,y 
    return x, y 

def mouseCollect(): 
    while True:   
    data.append(getMouseEvent()) 
    sum_data.append(tuple(map(sum,zip(sum_data[-1],data[-1])))) 
    plot.plot(sum_data[0], clear=True) 
    pg.QtGui.QApplication.processEvents() 
    print sum_data[-1]  

## 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 
btn1 = QtGui.QPushButton('Start') 

listw = QtGui.QListWidget() 
plot = pg.PlotWidget() 

def start_btn(): 
    print 'test' 
    threading.Thread(target=mouseCollect).start() 

btn1.clicked.connect(start_btn) 

## 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(btn1, 0, 0) # button goes in upper-left 
layout.addWidget(plot, 0, 1, 4, 1)  
## Display the widget as a new window 
w.show()  
## Start the Qt event loop 
app.exec_() 
##------------------------------------------------------------------ 

: 어쨌든 내가 원하는 위젯을 가지고있는 "쉽게"예를 복용, 나는 (더 최소한의 편집) 내 코드를 구현하지 못한다. 내 생각에, 버튼을 누르면, 그곳의 메토 상태에 연결되고 그냥 그 일을하고있는 것입니다. 좋아, 나는 무한 루프가 있지만 적어도 나는 뭔가를 봐야한다고 생각했다. 모든 도움이 절망적입니다. 또한이 문제에 관해 좋은 정보를 얻으려는 요령은 대단히 환영합니다.

관련 편집하십시오 QTimer를 사용하는 반복적 인 업데이트를 echocage

+0

는 [A를 제공 할 수

더 또는 덜 최종 코드 (전체 코드가 아닌)는 이제 다음과 같습니다 최소 예] (http://stackoverflow.com/help/mcve)? 만약 당신이 말하는 것은 버튼이 작동하고'mouseCollect'가 호출된다면, 문제는'mouseCollect'에 있습니다 -이 예제에서는 버튼이 전혀 필요하지 않습니다. 또한 들여 쓰기가 올바른지 확인하십시오. – Lack

+0

수정 됨. 나는 더 많이 자르고, 아직도 완전해야하는 곳을 모른다. :) 그것을 테스트했고 같은 문제가있다. 고마워. – user3759978

+0

좋아, 문제는 당신이 mouseCollect를 같은 스레드에서 실행하고 있다는 것입니다. 루프에서 영원히 기다리고 있기 때문에 마우스 이벤트 핸들러가 반환하지 않으면 GUI가 정지됩니다. 이 문제를 피하려면 mouseCollect를 새 스레드에서 실행 해보십시오. 그러나 PyQT가 멀티 스레드 호출을 처리하는 방법을 알려주지는 못합니다. 당신은 (대상 = mouseCollect) .start()를 스레딩 모듈에서 스레드를 가져 오기 및 '스레드를 호출하여 ' 당신은 한 번만 수행하면 그렇게 할 수 있습니다 당신은 본체에 그것을 할 경우에도 아마 수 프로그램의 – Echocage

답변

0

마침내 발견했습니다. 나는 어떻게 든 깨닫지 못했다. 당신은 열등한 배열을 사용해야 만한다. 또한 나는 플로팅을 위해 curve.setdata를 사용하지 않았다. 그것이 정말 효율적으로 기록되지 않습니다, 잘

class mouseCollect(QtCore.QThread): 
    def __init__(self): 

     QtCore.QThread.__init__(self) 

    def run (self): 
     global e, curve, curve2, data1, data2 
     while e.wait(): 
     tmp = getMouseEvent() #returns tuples in form of (x,y) 
     data1 = np.append(data1, tmp[0]) 
     data2 = np.append(data2, tmp[1]) 
     sum1= np.cumsum(data1) 
     sum2= np.cumsum(data2)  

     curve.setData(y=sum1) 
     curve2.setData(y=sum2) 
     guiPE # process event thingy 

    def stop(self): 
     e.clear() 

을하지만, 그것을 작동합니다 :)

2

가장 좋은 방법에 의해 제안 스레드를 삽입했다. 이런 식으로 모든 업데이트 (무한 루프는 허용되지 않음) 후에 프로그램 컨트롤이 Qt 이벤트 루프로 돌아갈 수 있으며 Qt는 주기적으로 업데이트 기능을 호출합니다.

예를 들어, pyqtgraph에 포함 된 업데이트 플롯 예제 중 하나를 참조하십시오 https://github.com/pyqtgraph/pyqtgraph/blob/develop/examples/Plotting.py#L58

스레딩이 제대로 수행하기가 매우 어렵고 잘못을 끝낼 때 일반적으로 그 디버깅하기 어려운 충돌로 끝날. 이벤트 시스템에 대해 매우 확신하고 스레딩의 함정에 익숙해 질 때까지 스레딩을 피하는 것이 좋습니다.

+0

의견을 보내 주셔서 감사합니다. 두 버전 모두 실행 중입니다 (스레드 및 타이머).타이머 버전이 잘 실행되지만 버튼을 클릭하기 위해 다른 입력 장치를 사용하려고하면 멈 춥니 다. 그래서 나는 그 솔루션을 고수 할 순간에 문제가 발생하지 않았으므로 생각합니다. ^^ – user3759978