app = QtGui.QApplication(sys.argv) # Example 1 rs1 = QRangeSlider() rs1.show() rs1.setWindowTitle('example 1') rs1.setRange(15, 35) rs1.setBackgroundStyle('background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #222, stop:1 #333);') rs1.setSpanStyle('background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #282, stop:1 #393);') # Example 2 rs2 = QRangeSlider() rs2.show() rs2.setWindowTitle('example 2') rs2.setFixedWidth(400) rs2.setFixedHeight(36) rs2.setMin(0) rs2.setMax(100) rs2.setRange(30, 80) rs2.setDrawValues(False) rs2.setStyleSheet(""" QRangeSlider * { border: 0px; padding: 0px; } QRangeSlider #Head { background: url(data/filmstrip.png) repeat-x; } QRangeSlider #Span { background: url(data/clip.png) repeat-x;
class VideoFrame(QWidget): def __init__(self, *args, **kwargs): super(VideoFrame, self).__init__(*args, **kwargs) self.layout = QVBoxLayout() self.img_list = [] # STREAM 1 LABEL AREA self.label = QLabel('Nothing to show right now.', self) self.label.setAlignment(Qt.AlignCenter) self.label.setGeometry(30, 20, 750, 360) self.layout.addWidget(self.label) # PLAY BUTTON self.play = QPushButton(self) icon = QPixmap(os.path.join(os.path.dirname(__file__), 'icons', 'play.png')) self.play.setIcon(QIcon(icon)) self.play.setGeometry(320, 370, 50, 30) self.play.clicked.connect(self.timerEvent) self.layout.addWidget(self.play) # PAUSE BUTTON self.pause = QPushButton(self) icon = QPixmap(os.path.join(os.path.dirname(__file__), 'icons', 'pause.png')) self.pause.setIcon(QIcon(icon)) self.pause.setGeometry(400, 370, 50, 30) self.pause.clicked.connect(self.pauseTimer) self.layout.addWidget(self.pause) # FAST-FORWARD self.ff = QPushButton(self) icon = QPixmap(os.path.join(os.path.dirname(__file__), 'icons', 'ff.png')) self.ff.setIcon(QIcon(icon)) self.ff.setGeometry(560, 370, 50, 30) self.ff.clicked.connect(self.fastForward) self.layout.addWidget(self.ff) # SLOWDOWN self.fr = QPushButton(self) icon = QPixmap(os.path.join(os.path.dirname(__file__), 'icons', 'fr.png')) self.fr.setIcon(QIcon(icon)) self.fr.setGeometry(240, 370, 50, 30) self.fr.clicked.connect(self.slowdown) self.layout.addWidget(self.fr) self.stop = QPushButton(self) icon = QPixmap(os.path.join(os.path.dirname(__file__), 'icons', 'stop.png')) self.stop.setIcon(QIcon(icon)) self.stop.setGeometry(480, 370, 50, 30) self.stop.clicked.connect(self.stopTimer) self.layout.addWidget(self.stop) # SLIDER 1 self.slider = QSlider(Qt.Horizontal, self) self.layout.addWidget(self.slider) self.slider.setGeometry(10, 400, 825, 20) self.slider.valueChanged.connect(self.showImage) # RANGE SLIDER self.range_slider = QRangeSlider(self) self.range_slider.setFixedHeight(30) self.range_slider.setFixedWidth(825) self.range_slider.move(10, 420) self.range_slider.endValueChanged.connect(self.boundEnd) self.range_slider.startValueChanged.connect(self.boundStart) self.timer = QBasicTimer() # FIXME consider something with less lag self.startIdx = 0 self.idx = 0 self.delay = 1000 self.skip = 1 self.calibrate_mode = False self.alpha = None self.beta = None self.t = None self.z = None def size(self): return len(self.img_list) def mousePressEvent(self, event): print('Calibration: ' + str(self.calibrate_mode)) if self.calibrate_mode is True: c_x, c_y = (event.x(), event.y()) self.alpha, self.beta = alpha_beta(c_x, c_y) self.t = lp_projection_calibration(self.alpha, self.beta) elif self.t is not None: c_x, c_y = (event.x(), event.y()) self.alpha, self.beta = alpha_beta(c_x, c_y) self.z = lp_projection(self.alpha, self.beta, self.t) print('Height (inches): ' + str(self.z)) def setCalibrateMode(self): self.calibrate_mode = not self.calibrate_mode def boundEnd(self): self.endIdx = self.range_slider.end() def boundStart(self): self.startIdx = self.range_slider.start() self.idx = self.startIdx def setSkipRate(self, skip_rate): self.skip = skip_rate def setFrameRate(self, delay): self.delay = delay def setImgList(self, img_list): self.img_list = img_list self.endIdx = len(self.img_list)-1 self.slider.setRange(0, len(self.img_list)-1) self.range_slider.setMax(len(self.img_list)-1) pixmap = QPixmap(self.img_list[self.idx]).scaled(600, 800, Qt.KeepAspectRatio, Qt.FastTransformation) #self.pixmap_list = [QPixmap(self.img_list[i]).scaled(600, 800, Qt.KeepAspectRatio, Qt.FastTransformation) for i in range(0, len(self.img_list))] self.label.setPixmap(pixmap) def showImage(self): if len(self.img_list) == 0: return self.idx = self.slider.value() pixmap = QPixmap(self.img_list[self.idx]).scaled(600, 800, Qt.KeepAspectRatio, Qt.FastTransformation) self.label.setPixmap(pixmap) def showImage(self, idx): if len(self.img_list) == 0 or idx > len(self.img_list)-1: return self.idx = idx self.slider.setValue(idx) pixmap = QPixmap(self.img_list[idx]).scaled(600, 800, Qt.KeepAspectRatio, Qt.FastTransformation) self.label.setPixmap(pixmap) def timerEvent(self, e=None): if len(self.img_list) == 0: return if self.idx > self.endIdx: self.timer.stop() self.idx = self.startIdx return self.timer.start(self.delay, self) self.showImage(self.idx) #self.label.setPixmap(self.pixmap_list[self.idx]) self.slider.setValue(self.idx) self.idx += self.skip def pauseTimer(self): self.timer.stop() def stopTimer(self): self.timer.stop() self.startIdx = self.range_slider.start() self.idx = self.startIdx def fastForward(self): if len(self.img_list) == 0: return self.delay /= 2 def slowdown(self): if len(self.img_list) == 0: return self.delay *= 2
rs1 = QRangeSlider() rs1.show() rs1.setWindowTitle('example 1') rs1.setRange(15, 35) rs1.setBackgroundStyle( 'background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #222, stop:1 #333);' ) rs1.setSpanStyle( 'background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #282, stop:1 #393);' ) # Example 2 rs2 = QRangeSlider() rs2.show() rs2.setWindowTitle('example 2') rs2.setFixedWidth(400) rs2.setFixedHeight(36) rs2.setMin(0) rs2.setMax(100) rs2.setRange(30, 80) rs2.setDrawValues(False) rs2.setStyleSheet(""" QRangeSlider * { border: 0px; padding: 0px; } QRangeSlider #Head { background: url(data/filmstrip.png) repeat-x; } QRangeSlider #Span { background: url(data/clip.png) repeat-x;
class VideoFrame(QWidget): def __init__(self, *args, **kwargs): super(VideoFrame, self).__init__(*args, **kwargs) self.layout = QVBoxLayout() self.img_list = [] # VIDEO LABEL AREA self.label = QLabel('Nothing to show right now.', self) self.label.setAlignment(Qt.AlignCenter) self.label.setGeometry(30, 20, 750, 360) self.layout.addWidget(self.label) # PLAY BUTTON self.play = QPushButton(self) icon = QPixmap( os.path.join(os.path.dirname(__file__), 'icons', 'play.png')) self.play.setIcon(QIcon(icon)) self.play.setGeometry(320, 370, 50, 30) self.play.clicked.connect(self.timerEvent) self.layout.addWidget(self.play) # PAUSE BUTTON self.pause = QPushButton(self) icon = QPixmap( os.path.join(os.path.dirname(__file__), 'icons', 'pause.png')) self.pause.setIcon(QIcon(icon)) self.pause.setGeometry(400, 370, 50, 30) self.pause.clicked.connect(self.pauseTimer) self.layout.addWidget(self.pause) # FAST-FORWARD self.ff = QPushButton(self) icon = QPixmap( os.path.join(os.path.dirname(__file__), 'icons', 'ff.png')) self.ff.setIcon(QIcon(icon)) self.ff.setGeometry(480, 370, 50, 30) self.ff.clicked.connect(self.fastForward) self.layout.addWidget(self.ff) # SLOWDOWN self.fr = QPushButton(self) icon = QPixmap( os.path.join(os.path.dirname(__file__), 'icons', 'fr.png')) self.fr.setIcon(QIcon(icon)) self.fr.setGeometry(240, 370, 50, 30) self.fr.clicked.connect(self.slowdown) self.layout.addWidget(self.fr) # SLIDER 1 self.slider = QSlider(Qt.Horizontal, self) self.layout.addWidget(self.slider) self.slider.setGeometry(10, 400, 825, 20) self.slider.valueChanged.connect(self.showImage) # RANGE SLIDER self.range_slider = QRangeSlider(self) self.range_slider.setFixedHeight(30) self.range_slider.setFixedWidth(825) self.range_slider.move(10, 420) self.range_slider.endValueChanged.connect(self.boundEnd) self.range_slider.startValueChanged.connect(self.boundStart) self.timer = QBasicTimer() # FIXME consider something with less lag self.startIdx = 0 self.endIdx = 0 self.idx = 0 self.delay = 1000 self.skip = 1 self.threadpool = QThreadPool() self.thread = None def size(self): return len(self.img_list) def boundEnd(self): self.endIdx = self.range_slider.end() def boundStart(self): self.startIdx = self.range_slider.start() self.idx = self.startIdx def setSkipRate(self, skip_rate): self.skip = skip_rate if self.thread is not None: self.thread.kwargs['skip'] = self.delay / 1000 def setFrameRate(self, delay): self.delay = delay if self.thread is not None: self.thread.kwargs['delay'] = self.delay / 1000 def setImgList(self, img_list): self.img_list = img_list self.endIdx = len(self.img_list) - 1 self.slider.setRange(0, len(self.img_list) - 1) self.range_slider.setMax(len(self.img_list) - 1) pixmap = QPixmap(self.img_list[self.idx]).scaled( 600, 800, Qt.KeepAspectRatio, Qt.FastTransformation) self.label.setPixmap(pixmap) def showImage(self): if len(self.img_list) == 0: return self.idx = self.slider.value() pixmap = QPixmap(self.img_list[self.idx]).scaled( 600, 800, Qt.KeepAspectRatio, Qt.FastTransformation) self.label.setPixmap(pixmap) def showImage(self, idx): if len(self.img_list) == 0 or idx > len(self.img_list) - 1: return self.idx = idx self.slider.setValue(idx) pixmap = QPixmap(self.img_list[idx]).scaled(600, 800, Qt.KeepAspectRatio, Qt.FastTransformation) self.label.setPixmap(pixmap) def timerEvent(self): self.thread = DelayWorker(self.startIdx, self.endIdx, delay=self.delay, skip=self.skip) self.thread.signals.idx.connect(self.showImage) self.threadpool.start(self.thread) # if len(self.img_list) == 0: # return # if self.idx > self.endIdx: # self.timer.stop() # self.idx = self.startIdx # return # self.timer.start(self.delay, self) # pixmap = QPixmap(self.img_list[self.idx]).scaled(600, 800, Qt.KeepAspectRatio, Qt.FastTransformation) # self.label.setPixmap(pixmap) # self.slider.setValue(self.idx) # self.idx += self.skip def pauseTimer(self): self.thread.stop = True self.startIdx = self.idx def fastForward(self): if len(self.img_list) == 0: return self.thread.kwargs['delay'] /= 2 def slowdown(self): if len(self.img_list) == 0: return self.thread.kwargs['delay'] *= 2
class RangesliderZmq(QtGui.QWidget): def __init__(self): #app = QtGui.QApplication(sys.argv) super().__init__() self.gesture_dict = GestureDict() self.port = 5556 logging.basicConfig(level=logging.DEBUG, format='%(message)s') self.initUI() #sys.exit(app.exec_()) def initUI(self): port = self.port self.create_socket(port) range_label = QtGui.QLabel('events') self.range_events = QRangeSlider() self.range_events.show() self.range_events.setFixedWidth(300) self.range_events.setFixedHeight(36) self.range_events.setMin(0) self.range_events.setMax(4) self.range_events.setRange(0, 1) self.range_events.startValueChanged.connect( lambda: self.keep_slider_min(self.range_events)) hbox_events = QtGui.QHBoxLayout() hbox_events.addWidget(range_label) hbox_events.addWidget(self.range_events) self.textbox = QtGui.QLineEdit() self.update_btn = QtGui.QPushButton("update") self.update_btn.clicked.connect(lambda: self.button_click(port)) self.update_btn.setFixedWidth(100) hbox = QtGui.QHBoxLayout() hbox.addWidget(self.update_btn) magnitude_label = QtGui.QLabel('magnitude in g/10') self.range_magnitude = QRangeSlider() self.range_magnitude.show() self.range_magnitude.setFixedWidth(300) self.range_magnitude.setFixedHeight(36) self.range_magnitude.setMin(20) self.range_magnitude.setMax(80) self.range_magnitude.setRange(20, 30) hbox_magnitude = QtGui.QHBoxLayout() hbox_magnitude.addWidget(magnitude_label) hbox_magnitude.addWidget(self.range_magnitude) self.filter_length = QRangeSlider() self.filter_length.show() self.filter_length.setFixedWidth(300) self.filter_length.setFixedHeight(36) self.filter_length.setMin(0) self.filter_length.setMax(250) self.filter_length.setRange(0, 100) self.filter_length.startValueChanged.connect( lambda: self.keep_slider_min(self.filter_length)) filter_length_label = QtGui.QLabel('filter length in samples') hbox_length = QtGui.QHBoxLayout() hbox_length.addWidget(filter_length_label) hbox_length.addWidget(self.filter_length) self.message_label = QtGui.QLabel("messages will be here") self.exit_btn = QtGui.QPushButton('exit') self.exit_btn.clicked.connect( lambda: self.exit_click(self.socket, self.context, port)) vbox = QtGui.QVBoxLayout() vbox.addStretch(1) vbox.addLayout(hbox_events) vbox.addLayout(hbox_magnitude) vbox.addLayout(hbox_length) vbox.addWidget(self.message_label) vbox.addWidget(self.update_btn) vbox.addLayout(hbox) vbox.addWidget(self.exit_btn) self.setLayout(vbox) self.setGeometry(300, 300, 300, 150) self.setWindowTitle('rangesliders') self.show() @QtCore.pyqtSlot() def button_click(self, port): ''' handle button click event ''' try: self.update_gesture_dict() message = self.gesture_dict.make_json() logging.info('rangeslider sending message {}'.format(message)) self.socket.send_json(message, flags=zmq.NOBLOCK) except zmq.error.Again as e: logging.info('no receiver for the message: {}'.format(e)) # restart the socket if nothing to receive the message # if receiver closed, the socket needs to be restarted self.close_socket() self.create_socket(port) def close_socket(self): ''' close the socket and context ''' self.socket.close() self.context.term() def create_socket(self, port): ''' create a socket using pyzmq with PAIR context ''' self.context = zmq.Context() self.socket = self.context.socket(zmq.PAIR) self.socket.setsockopt(zmq.LINGER, 0) self.socket.bind("tcp://*:%s" % port) stream_pair = zmqstream.ZMQStream(self.socket) stream_pair.on_recv(self.process_message) def exit_click(self, socket, context, port): ''' handle exit button click ''' socket.close() context.term() sys.exit() def filter_length_change(self): ''' filter length slider has changed ''' length = self.filter_length.value() self.set_message_label('filter_length: {}'.format(length)) def keep_slider_min(self, slider): ''' keep the slider length minimum as one ''' try: slider.setStart(0) except RuntimeError as e: pass self.set_message_label('cannot change this') def process_message(self, msg): time = datetime.now() time = time.strftime('%H:%M:%S') text = ('{}: {}'.format(time, msg)) self.message_label.setText(text) def set_message_label(self, text): self.message_label.setText(text) def timer_timeout(self): ''' handle the QTimer timeout ''' try: msg = self.socket.recv(flags=zmq.NOBLOCK).decode() self.process_message(msg) except zmq.error.Again as e: return def update_gesture_dict(self): ''' get status of all the rangesliders into GestureDict object ''' magnitude_min, magnitude_max = self.range_magnitude.getRange() filter_length = self.filter_length.end() events = self.range_events.end() self.gesture_dict.update_dict(magnitude_min=magnitude_min, \ magnitude_max=magnitude_max/10, events=events, \ filter_length=filter_length)