单击鼠标捕获PlotWidget坐标

时间:2018-07-06 17:39:40

标签: python audio pyqt4 pyqt5 pyqtgraph

因此,我有这些代码可以通过文件浏览器生成波形并进行绘制,并使用PlotWidget嵌入到PyQT4 GUI中。我制作了LinearRegionItem,其中起点是常量,例如将其设置为x坐标[0,1]。我的问题是我需要单击我的PlotWidget并获取其x坐标,并将其作为LinearRegionItem的起点。我正在使用QEvent.MouseButtonPress,它获取了整个窗口的坐标,因为不幸的是,根据带有LinearRegionItem的PyQtGraph文档,没有sigClicked.connect(),仅用于ROI和其他。

import os
import sys
import wave
import scipy.io.wavfile as wavfile
import scipy
import numpy as np
from PyQt4 import QtGui, QtCore
from pyqtgraph.Qt import QtGui, QtCore
from PyQt4.QtCore import QEvent
import pyqtgraph as pg

from pydub import AudioSegment

from Tkinter import *
import Tkinter as tk
import Tkinter, Tkconstants, tkFileDialog
import pyaudio

p = pyaudio.PyAudio()
class Window(QtGui.QMainWindow):

    def __init__(self):
        super(Window, self).__init__()
        self.setGeometry(50, 50, 500, 300)
        self.setWindowTitle("Awediosome")
        #self.setWindowIcon(QtGui.QIcon(''))
        self.show()
        self.homeUI()

    def homeUI(self):
        self.wid = QtGui.QWidget()
        self.createMenu()
        self.wavSpace()

        mainLayout = QtGui.QVBoxLayout()
        mainLayout.addWidget(self.verticalGroupBox)
        self.wid.setLayout(mainLayout)
        self.setCentralWidget(self.wid)

    def createMenu(self):
        self.statusBar()
        openFile = QtGui.QAction("Open File", self)
        openFile.setShortcut("Ctrl+O")
        openFile.triggered.connect(self.openFile)
        self.mainMenu = self.menuBar()
        fileMenu = self.mainMenu.addMenu('&File')
        fileMenu.addAction(openFile)

    def wavSpace(self):
        self.verticalGroupBox = QtGui.QGroupBox("Waveforms")
        self.layoutV = QtGui.QVBoxLayout()

        self.waveforms = QtGui.QListWidget(self)
        self.waveformPlot = pg.PlotWidget()
        self.verticalGroupBox.setLayout(self.layoutV)

    def openFile(self):
        self.fileName = tkFileDialog.askopenfilename(filetypes=(("Audio 
        Files", ".wav .ogg .mp3"), ("All Files", "*.*")))
        if (self.fileName.lower().endswith('.mp3')):
            # converting mp3 to wav file extension
            sound = AudioSegment.from_mp3(self.fileName)
            sound.export(self.fileName, format="wav")
            path = fileName
            base = os.path.splitext(self.fileName)[0]
            self.fileName = os.rename(path, base + ".wav")
            self.waveform(self.fileName)
        elif (self.fileName.lower().endswith('.wav')):
            self.waveform(self.fileName)

    def regionUpdated(self, regionItem):
        self.start, self.end = regionItem.getRegion()
        print self.start, self.end
        if self.h.getRegion() != None:
            self.h.getRegion() 

    def waveform(self, audio):
        self.waveFile = wave.open(audio,'rb')
        self.format = pyaudio.paInt16
        channel = self.waveFile.getnchannels()
        self.rate = self.waveFile.getframerate()
        self.frame = self.waveFile.getnframes()   
        self.stream = p.open(format=self.format,
                             channels=channel,
                             rate=self.rate,
                             output=True)
        self.data_int = self.waveFile.readframes(self.frame)
        self.data_plot = np.fromstring(self.data_int, 'Int16')
        self.data_plot.shape = -1, 2
        self.data_plot = self.data_plot.T
        self.timeDuration = (self.frame / float(self.rate))
        self.time = np.arange(0, self.frame) * (1.0 / self.rate)

        self.waveformPlot.plotItem.plot(self.time, self.data_plot[0])
        self.waveformPlot.setYRange(-30000, 30000, padding=0.01)
        self.waveformPlot.setXRange(0, self.timeDuration, padding=0.01)
        self.waveformPlot.setLabel('bottom', 'Time', 'Seconds')
        self.waveformPlot.setLabel('left', 'Frequency')

        self.layoutV.addWidget(self.waveformPlot)

        self.waveformPlot.installEventFilter(self)

        self.h = pg.LinearRegionItem([0, 1])
        self.h.setBounds([0, self.timeDuration])
        self.waveformPlot.addItem(self.h)
        self.h.sigRegionChanged.connect(self.regionUpdated)  

    def eventFilter(self, obj, event):
        if event.type() == QtCore.QEvent.MouseButtonPress:
            if event.button() == QtCore.Qt.LeftButton:
                if obj == self.waveformPlot:
                    self.waveformPlot.setFocus()
                    print("Focus in plot 1")
                    self.start, self.end = self.h.getRegion()
                    print ("Focus 1 (start, end): ", self.start, 
                                          self.end)
                    print ("", event.pos())
                    #self.h = pg.LinearRegionItem([event.x.pos()])
                    print ("", event.pos())
                    #self.h = pg.LinearRegionItem([event.x.pos()])

        return super(Window, self).eventFilter(obj,event)

def main():
    g = QtGui.QApplication(sys.argv)
    main = Window()
    tkinter_window = Tk() #for file openner
    tkinter_window.withdraw() #immediately close it
    sys.exit(g.exec_())

main()

如果您可以建议通过鼠标单击来单独捕获PlotWidget坐标的任何方法,我将非常高兴。先感谢您。 (很长的代码很抱歉)

0 个答案:

没有答案