class Temperature_graph():

    def __init__(self):
        '''
        This method adds the matplotlib pyplot to the UI.
        It fits the plot inside a layout, which is then set to a QFrame.
        The graph redrawing should be handled by a thread other than the main one.
        '''
        
        #self.queue = temp_queue
        #t = threading.Thread(target = self.queue.read_port)
        #t.daemon = True
        #t.start()
        
        # a figure instance to plot on
        self.figure = plt.figure()
        
        # this is the Canvas Widget that displays the `figure`
        self.canvas = FigureCanvas(self.figure)
        
        #Add a timer to redraw the graph
        #The timer is not optimal, and this should run on a separate thread.
        #The graph should be updated on demand... each time a new value is read from the serial port...
        #self.plot_timer = self.canvas.new_timer(interval=50)
        #self.plot_timer.add_callback(self.redraw_graph)
        
        
        #Create the layout for the frame
        self.layout = QHBoxLayout()
        
        #Add the Figure to the layout
        self.layout.addWidget(self.canvas)
        
        self.layout.setStretchFactor(self.canvas, 1)
        
        
        #self.redraw_graph()
        #self.plot_timer.start()
    
    def set_graph_queue(self, temperature_queue):
        self.queue = temperature_queue
    
    def get_layout(self):
        return self.layout
    
    def redraw_graph(self, new_value_read):
    #def redraw_graph(self):
        '''
        This method redraws the graph. It's called everytime the plot_timer
        reaches zero.
        '''
        #print "I enter here... x =", x
        
        # the histogram of the data
        #x should be my queue...
        data = self.queue.get_queue()
        #n, bins, patches = plt.hist(list(data), 50, normed=1, facecolor='b', alpha=0.75)
        #matplotlib.pyplot.bar(left, height, width=0.8, bottom=None, hold=None, **kwargs)
        N = numpy.arange(len(data)) #number of data to be plotted
        #print "N = ", N
        
        bar_plot = plt.bar( N, height = data, width = 0.8, bottom = None, color = 'c', hold = None)
        #plt.xlabel('Smarts')
        plt.ylabel('Valor de Temperatura')
        #plt.title('Histogram of IQ')
        #plt.text(60, .025, r'$\mu=100,\ \sigma=15$')
        #plt.axis([40, 160, 0, 0.03])
        plt.grid(True)
        plt.xlim(0, 20)
        plt.ylim(0, 45)
        
        #I erase the old data graph, because I'm redrawing it with new values.
        plt.hold(False)
        
        #Re-draw the graph (with the new values)
        self.canvas.draw()
        #plt.show()
        
        
        '''
        # random data
        data = self.queue.get_queue()
        print "cola = ", list(self.queue.get_queue())
        #data = [10,17,30,22,6,3,34,24,15]
        #random.random() for i in range(10)
        # create an axis
        ax = self.figure.add_subplot(111)
    
        # discards the old graph
        ax.hold(False)
        
        # plot data
        ax.plot(data, '*-')
        
        #Set rango de valores del eje y
        ax.set_ylim([0,42])
        ax.set_xlim([-1,20])
        ax.set_title("Variacion de Temperatura")
        #ax.xlabel('Smarts')
        
        # refresh canvas
        self.canvas.draw()
        '''
        
        
Esempio n. 2
0
class StepperWindow(QMainWindow):


    def __init__(self):
        QMainWindow.__init__(self)
        # filename = QFileDialog.getOpenFileName(self, "Open File")[0]
        # self.setWindowTitle(os.path.basename(filename))
        # self.transcript = StepperTranscript(filename)
        self.transcript = None
        self.outer_widget = QWidget()
        self.setCentralWidget(self.outer_widget)
        outer_layout = QHBoxLayout()
        self.outer_widget.setLayout(outer_layout)
        self.setLayout(outer_layout)
        left_layout = QVBoxLayout()
        outer_layout.addLayout(left_layout)

        display_widget = QWidget()
        left_layout.addWidget(display_widget)
        self.display_layout = QHBoxLayout()

        # self.turn = self.transcript.current_turn()
        self.time_field = qHotField("time", str, "00:00:00", min_size=75, max_size=75, pos="top", handler=self.update_time)
        self.display_layout.addWidget(self.time_field)
        self.speaker_field = qHotField("speaker", str, " ", min_size=75, max_size=75, pos="top", handler=self.update_speaker)
        self.display_layout.addWidget(self.speaker_field)
        self.utt_field = qHotField("utterance", str, " ", min_size=350, pos="top", handler=self.update_utterance, multiline=True)
        self.utt_field.setStyleSheet("font: 14pt \"Courier\";")
        # self.utt_field.efield.setFont(QFont('SansSerif', 12))
        self.display_layout.addWidget(self.utt_field)

        display_widget.setLayout(self.display_layout)
        self.display_layout.setStretchFactor(self.speaker_field, 0)
        self.display_layout.setStretchFactor(self.utt_field, 1)

        self.transcript_slider = QSlider(QtCore.Qt.Horizontal, self)
        self.display_layout.addWidget(self.transcript_slider)
        self.transcript_slider.setMaximum(100)
        self.connect(self.transcript_slider,
                     QtCore.SIGNAL("sliderMoved(int)"), self.position_transcript)
        left_layout.addWidget(self.transcript_slider)

        button_widget = TranscriptButtons(self)

        left_layout.addWidget(button_widget)
        left_layout.addWidget(QWidget())
        left_layout.setStretch(0, 0)
        left_layout.setStretch(1, 0)
        left_layout.setStretch(2, 0)
        left_layout.setStretch(3, 1)

        # video_buttons = VideoButtons(self)
        # outer_layout.addWidget(video_buttons)

        self.createKeypadButtons(self)
        left_layout.addWidget(self.keypadWidget)

        self.player = Player()
        outer_layout.addWidget(self.player)

        outer_layout.setStretch(0, 0)
        outer_layout.setStretch(1, 1)
        self.save_file_name = None

        command_list = [
            [self.open_video, "Open Video", {}, "Ctrl+o"],
            [self.open_transcript, "Open Transcript", {}, "Ctrl+t"],
            [self.play_or_pause, "Play/Pause", {}, Qt.CTRL + Qt.Key_P],
            [self.save_file, "Save", {}, "Ctrl+s"],
            [self.player.jump_video_backward, "Jump Back", {}, Qt.CTRL + Qt.Key_4],
            [self.player.jump_video_forward, "Jump Forward", {}, Qt.CTRL + Qt.Key_6],
            [self.go_to_previous_turn, "Previous", {}, "Ctrl+["],
            [self.go_to_next_turn, "Next", {}, "Ctrl+]"],
            ]

        menubar = self.menuBar()
        create_menu(self, menubar, "Stepper", command_list)

        QShortcut(QKeySequence(Qt.CTRL + Qt.Key_0), self, self.play_or_pause)
        QShortcut(QKeySequence(Qt.CTRL + Qt.Key_5), self, self.play_or_pause)
        QShortcut(QKeySequence(Qt.CTRL + Qt.Key_7), self, self.go_to_previous_turn)
        QShortcut(QKeySequence(Qt.CTRL + Qt.Key_9), self, self.go_to_next_turn)
        QShortcut(QKeySequence(Qt.CTRL + Qt.Key_4), self, self.player.jump_video_backward)
        QShortcut(QKeySequence(Qt.CTRL + Qt.Key_6), self, self.player.jump_video_forward)
        QShortcut(QKeySequence(Qt.CTRL + Qt.Key_2), self, self.player.reset_rate)
        QShortcut(QKeySequence(Qt.CTRL + Qt.Key_1), self, self.player.decrease_rate)
        QShortcut(QKeySequence(Qt.CTRL + Qt.Key_3), self, self.player.increase_rate)
        QShortcut(QKeySequence(Qt.CTRL + Qt.Key_G), self, self.sync_video_and_play)

    def createKeypadButtons(self, stepperWindow):

        self.keypadWidget = QtGui.QWidget()
        self.keypadWidget.setGeometry(QtCore.QRect(0, 0, 191, 101))
        self.keypadWidget.setMinimumSize(QtCore.QSize(191, 101))
        self.keypadWidget.setMaximumSize(QtCore.QSize(191, 101))
        self.keypadWidget.setObjectName("gridLayoutWidget")
        self.keypadGridLayout = QtGui.QGridLayout(self.keypadWidget)
        self.keypadGridLayout.setContentsMargins(0, 0, 0, 0)
        self.keypadGridLayout.setObjectName("keypadGridLayout")
        self.fasterbutton = QtGui.QPushButton(self.keypadWidget)
        self.fasterbutton.setObjectName("fasterbutton")
        self.keypadGridLayout.addWidget(self.fasterbutton, 2, 2, 1, 1)
        self.jumpforwardbutton = QtGui.QPushButton(self.keypadWidget)
        self.jumpforwardbutton.setObjectName("jumpforwardbutton")
        self.keypadGridLayout.addWidget(self.jumpforwardbutton, 1, 2, 1, 1)
        self.normalbutton = QtGui.QPushButton(self.keypadWidget)
        self.normalbutton.setObjectName("normalbutton")
        self.keypadGridLayout.addWidget(self.normalbutton, 2, 1, 1, 1)
        self.NextButton = QtGui.QPushButton(self.keypadWidget)
        self.NextButton.setObjectName("NextButton")
        self.keypadGridLayout.addWidget(self.NextButton, 0, 2, 1, 1)
        self.jumpbackbutton = QtGui.QPushButton(self.keypadWidget)
        self.jumpbackbutton.setObjectName("jumpbackbutton")
        self.keypadGridLayout.addWidget(self.jumpbackbutton, 1, 0, 1, 1)
        self.playButton = QtGui.QPushButton(self.keypadWidget)
        self.playButton.setObjectName("playButton")
        self.keypadGridLayout.addWidget(self.playButton, 1, 1, 1, 1)
        self.PreviousButton = QtGui.QPushButton(self.keypadWidget)
        self.PreviousButton.setObjectName("PreviousButton")
        self.keypadGridLayout.addWidget(self.PreviousButton, 0, 0, 1, 1)
        self.slowerbutton = QtGui.QPushButton(self.keypadWidget)
        self.slowerbutton.setObjectName("slowerbutton")
        self.keypadGridLayout.addWidget(self.slowerbutton, 2, 0, 1, 1)
        self.gotobutton = QtGui.QPushButton(self.keypadWidget)
        self.gotobutton.setObjectName("gotobutton")
        self.keypadGridLayout.addWidget(self.gotobutton, 0, 1, 1, 1)

        self.retranslateKeypadUi(stepperWindow)
        QtCore.QObject.connect(self.NextButton, QtCore.SIGNAL("clicked()"), stepperWindow.go_to_next_turn)
        QtCore.QObject.connect(self.PreviousButton, QtCore.SIGNAL("clicked()"), stepperWindow.go_to_previous_turn)
        QtCore.QObject.connect(self.gotobutton, QtCore.SIGNAL("clicked()"), stepperWindow.sync_video_and_play)
        QtCore.QObject.connect(self.jumpbackbutton, QtCore.SIGNAL("clicked()"), stepperWindow.jump_back)
        QtCore.QObject.connect(self.jumpforwardbutton, QtCore.SIGNAL("clicked()"), stepperWindow.jump_forward)
        QtCore.QObject.connect(self.slowerbutton, QtCore.SIGNAL("clicked()"), stepperWindow.slower)
        QtCore.QObject.connect(self.normalbutton, QtCore.SIGNAL("clicked()"), stepperWindow.normal_speed)
        QtCore.QObject.connect(self.fasterbutton, QtCore.SIGNAL("clicked()"), stepperWindow.faster)
        QtCore.QObject.connect(self.playButton, QtCore.SIGNAL("clicked()"), stepperWindow.play_or_pause)
        QtCore.QMetaObject.connectSlotsByName(stepperWindow)

    def retranslateKeypadUi(self, stepperWindow):
        stepperWindow.setWindowTitle(QtGui.QApplication.translate("stepperWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
        self.fasterbutton.setText(QtGui.QApplication.translate("stepperWindow", "Faster", None, QtGui.QApplication.UnicodeUTF8))
        self.jumpforwardbutton.setText(QtGui.QApplication.translate("stepperWindow", "Jump+", None, QtGui.QApplication.UnicodeUTF8))
        self.normalbutton.setText(QtGui.QApplication.translate("stepperWindow", "Normal", None, QtGui.QApplication.UnicodeUTF8))
        self.NextButton.setText(QtGui.QApplication.translate("stepperWindow", "Next", None, QtGui.QApplication.UnicodeUTF8))
        self.jumpbackbutton.setText(QtGui.QApplication.translate("stepperWindow", "Jump-", None, QtGui.QApplication.UnicodeUTF8))
        self.playButton.setText(QtGui.QApplication.translate("stepperWindow", "Play", None, QtGui.QApplication.UnicodeUTF8))
        self.PreviousButton.setText(QtGui.QApplication.translate("stepperWindow", "Prev", None, QtGui.QApplication.UnicodeUTF8))
        self.slowerbutton.setText(QtGui.QApplication.translate("stepperWindow", "Slower", None, QtGui.QApplication.UnicodeUTF8))
        self.gotobutton.setText(QtGui.QApplication.translate("stepperWindow", "GoTo", None, QtGui.QApplication.UnicodeUTF8))

    def open_transcript(self):
        filename = QFileDialog.getOpenFileName(self, "Open File")[0]
        self.setWindowTitle(os.path.basename(filename))
        self.transcript = StepperTranscript(filename)
        self.display_current_turn()


    def position_transcript(self, position):
        self.transcript.move_to_position(1.0 * position / 100)
        self.display_current_turn()

    def go_to_next_turn(self):
        self.transcript.go_to_next()
        self.display_current_turn()

    def update_time(self):
        self.turn["time"] = self.time_field.value

    def update_speaker(self):
        self.turn["speaker"] = self.speaker_field.value

    def update_utterance(self):
        self.turn["utterance"] = self.utt_field.value

    def go_to_previous_turn(self):
        self.transcript.go_to_previous()
        self.display_current_turn()

    def display_current_turn(self):
        self.turn = self.transcript.current_turn()
        self.time_field.value = self.turn["time"]
        self.speaker_field.value = self.turn["speaker"]
        self.utt_field.value = self.turn["utterance"]

    def delete_current_turn(self):
        self.transcript.delete_current()
        self.display_current_turn()

    def save_file_as(self):
        filename = QFileDialog.getSaveFileName(self, "File name for save")[0]
        self.save_file_name = filename
        self.transcript.commit_all()
        self.transcript.save_as_csv(filename)

    def save_file(self):
        if self.save_file_name is None:
            self.save_file_as()
        else:
            self.transcript.commit_all()
            self.transcript.save_as_csv(self.save_file_name)

    def revert_current_and_redisplay(self):
        self.transcript.revert_current()
        self.display_current_turn()

    def open_video(self):
        # self.player = Player()
        # self.player.show()
        # self.player.resize(640, 480)
        self.player.OpenFile()

    def play_or_pause(self):
        self.player.PlayPause()

    def slower(self):
        self.player.decrease_rate()

    def faster(self):
        self.player.increase_rate()

    def normal_speed(self):
        self.player.reset_rate()

    def fill_time_code(self):
        self.time_field.value = self.player.getCurrentTimeCode()

    def sync_video_and_play(self):
        self.sync_video()
        if not self.player.mediaplayer.is_playing():
            self.play_or_pause()

    def jump_back(self):
        self.player.jump_video_backward()

    def jump_forward(self):
        self.player.jump_video_forward()

    def sync_video(self):
        self.player.setTimeCode(self.time_field.value)

    def insert_before(self):
        new_uid = self.transcript.insert_new(self.transcript.current_uid)
        self.display_current_turn()

    def insert_after(self):
        new_uid = self.transcript.insert_new(self.transcript.current_uid, "after")
        self.display_current_turn()

    def closeEvent(self, event):
        msgBox = QMessageBox()
        msgBox.setText("Do you want to save before quitting?")
        msgBox.setInformativeText("Do you want to save your changes?")
        msgBox.setStandardButtons(QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel)
        msgBox.setDefaultButton(QMessageBox.Save)
        ret = msgBox.exec_()
        if ret == QMessageBox.Save:
            self.save_file()
            event.accept()
        elif ret == QMessageBox.Discard:
            event.accept()
        else:
            event.ignore()

    def commit(self):
        self.transcript.commit_current()

    def commit_all(self):
        self.transcript.commit_all()
Esempio n. 3
0
class StepperWindow(QMainWindow):

    def __init__(self):
        QMainWindow.__init__(self)
        # filename = QFileDialog.getOpenFileName(self, "Open File")[0]
        # self.setWindowTitle(os.path.basename(filename))
        # self.transcript = StepperTranscript(filename)
        self.save_file_name = None
        self.explorer_table = None
        self.transcript = None
        self.setupUi(self)
        self.setAcceptDrops(True)

    def dragEnterEvent(self, event):
        event.accept()

    def dropEvent(self, event):
        for url in event.mimeData().urls():
            path = url.toLocalFile()
            self.open_transcript(fullname=path)

    def open_transcript(self, fullname=None):
        if self.transcript is not None:
            newStepperWindow = StepperWindow()
            stepper_windows.append(newStepperWindow)
            newStepperWindow.show()
            newStepperWindow.resize(1250, 1000)
            newStepperWindow.open_transcript(fullname)

        else:
            if fullname is None:
                fullname = QFileDialog.getOpenFileName(self, "Open File")[0]
            self.save_file_name = fullname
            self.setWindowTitle(os.path.basename(fullname))
            self.transcript = StepperTranscript(fullname)
            self.display_current_turn()
            self.show_transcript_in_explorer()
            if self.transcript.video_file_name != None:
                self.open_video(self.transcript.video_file_name)

    def position_transcript(self, position):
        self.transcript.move_to_position(1.0 * position / 100)
        self.display_current_turn()

    def show_transcript_in_explorer(self):
        transcript_array = self.transcript.get_transcript_as_array()
        self.click_handler = ExploreClickHandler(self)
        self.explorer_table = ExplorerTable(transcript_array, click_handler=self.click_handler)
        self.big_splitter.addWidget(self.explorer_table)
        # self.outer_layout.setStretch(2, 1)
        self.explorer_table.highlight_row(self.transcript.current_index())

    def go_to_next_turn(self):
        self.transcript.go_to_next()
        self.display_current_turn()

    def update_time(self):
        self.turn["time"] = self.time_field.value
        if self.explorer_table is not None:
            table_item = self.explorer_table.item(self.transcript.current_index(), 1)
            table_item.setText(self.time_field.value)

    def update_speaker(self):
        self.turn["speaker"] = self.speaker_field.value
        if self.explorer_table is not None:
            table_item = self.explorer_table.item(self.transcript.current_index(), 2)
            table_item.setText(self.speaker_field.value)

    def update_utterance(self):
        self.turn["utterance"] = self.utt_field.value
        if self.explorer_table is not None:
            table_item = self.explorer_table.item(self.transcript.current_index(), 3)
            table_item.setText(self.utt_field.value)

    def go_to_previous_turn(self):
        self.transcript.go_to_previous()
        self.display_current_turn()

    def go_to_row(self, the_row):
        self.transcript.go_to_index(the_row)
        self.display_current_turn()

    def display_current_turn(self):
        self.turn = self.transcript.current_turn()
        self.time_field.value = self.turn["time"]
        self.speaker_field.value = self.turn["speaker"]
        self.utt_field.value = self.turn["utterance"]
        if self.explorer_table is not None:
            self.explorer_table.highlight_row(self.transcript.current_index())
        self.utt_field.efield.setFocus()
        self.utt_field.efield.moveCursor(QTextCursor.Start, mode=QTextCursor.MoveAnchor)

    def delete_current_turn(self):
        self.transcript.delete_current()
        self.display_current_turn()

    def save_file_as(self):
        filename = QFileDialog.getSaveFileName(self, "File name for save")[0]
        self.save_file_name = filename
        self.transcript.commit_all()
        self.transcript.save_as_csv(filename)

    def save_file(self):
        if self.save_file_name is None:
            self.save_file_as()
        else:
            self.transcript.commit_all()
            self.transcript.save_as_csv(self.save_file_name)

    def revert_current_and_redisplay(self):
        self.transcript.revert_current()
        self.display_current_turn()

    def open_video(self, filename=None):
        # self.player = Player()
        # self.player.show()
        # self.player.resize(640, 480)
        self.player.OpenFile(filename)

    def play_or_pause(self):
        self.player.PlayPause()

    def slower(self):
        self.player.decrease_rate()

    def faster(self):
        self.player.increase_rate()

    def normal_speed(self):
        self.player.reset_rate()

    def fill_time_code(self):
        self.time_field.value = self.player.getCurrentTimeCode()

    def sync_video_and_play(self):
        self.sync_video()
        if not self.player.mediaplayer.is_playing():
            self.play_or_pause()

    def jump_back(self):
        self.player.jump_video_backward()

    def jump_forward(self):
        self.player.jump_video_forward()

    def sync_video(self):
        self.player.setTimeCode(self.time_field.value)

    def insert_before(self):
        new_uid = self.transcript.insert_new(self.transcript.current_uid)
        if self.explorer_table is not None:
            self.explorer_table.insert_row(self.transcript.current_index(), [new_uid, "", "", ""])
        self.display_current_turn()

    def insert_after(self):
        new_uid = self.transcript.insert_new(self.transcript.current_uid, "after")
        if self.explorer_table is not None:
            self.explorer_table.insert_row(self.transcript.current_index(), [new_uid, "", "", ""])
        self.display_current_turn()

    def closeEvent(self, event):
        msgBox = QMessageBox()
        msgBox.setText("Do you want to save before quitting?")
        msgBox.setInformativeText("Do you want to save your changes?")
        msgBox.setStandardButtons(QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel)
        msgBox.setDefaultButton(QMessageBox.Save)
        ret = msgBox.exec_()
        if ret == QMessageBox.Save:
            self.save_file()
            event.accept()
        elif ret == QMessageBox.Discard:
            event.accept()
        else:
            event.ignore()

    def commit(self):
        self.transcript.commit_current()

    def commit_all(self):
        self.transcript.commit_all()

    def go_to_next_word(self):
        c = self.utt_field.efield.textCursor()
        if c.selectedText() != "": # If nothing is selected, select the current word
            self.utt_field.efield.moveCursor(QTextCursor.NextWord, QTextCursor.MoveAnchor)
        self.utt_field.efield.moveCursor(QTextCursor.EndOfWord, QTextCursor.KeepAnchor)
        c = self.utt_field.efield.textCursor()
        if c.selectedText() == "": # this addresses the case where I'm in front of a blank space
            self.utt_field.efield.moveCursor(QTextCursor.NextWord, QTextCursor.MoveAnchor)
            self.utt_field.efield.moveCursor(QTextCursor.EndOfWord, QTextCursor.KeepAnchor)

    def go_to_previous_word(self):
        c = self.utt_field.efield.textCursor()
        pos = c.position()
        self.utt_field.efield.moveCursor(QTextCursor.StartOfWord, QTextCursor.MoveAnchor)
        self.utt_field.efield.moveCursor(QTextCursor.PreviousWord, QTextCursor.MoveAnchor)
        self.utt_field.efield.moveCursor(QTextCursor.EndOfWord, QTextCursor.KeepAnchor)
        c = self.utt_field.efield.textCursor()
        if c.position() == pos:
            self.utt_field.efield.moveCursor(QTextCursor.StartOfWord, QTextCursor.MoveAnchor)
            self.utt_field.efield.moveCursor(QTextCursor.PreviousWord, QTextCursor.MoveAnchor)
            self.utt_field.efield.moveCursor(QTextCursor.PreviousWord, QTextCursor.MoveAnchor)
            self.utt_field.efield.moveCursor(QTextCursor.EndOfWord, QTextCursor.KeepAnchor)

    def setupUi(self, stepperWindow):
        stepperWindow.setObjectName("stepperWindow")
        self.outer_widget = QtGui.QWidget(stepperWindow)
        # sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
        # sizePolicy.setHorizontalStretch(0)
        # sizePolicy.setVerticalStretch(0)
        # sizePolicy.setHeightForWidth(self.outer_widget.sizePolicy().hasHeightForWidth())
        # self.outer_widget.setSizePolicy(sizePolicy)
        self.outer_widget.setObjectName("outer_widget")
        self.outer_layout = QtGui.QHBoxLayout(self.outer_widget)
        self.outer_layout.setContentsMargins(0, 0, 0, 0)
        self.outer_layout.setObjectName("outer_layout")
        self.big_splitter = QSplitter()
        self.outer_layout.addWidget(self.big_splitter)
        self.left_layout = QtGui.QVBoxLayout()
        self.left_layout.setObjectName("left_layout")
        self.left_widget = QWidget()
        self.left_widget.setLayout(self.left_layout)
        self.big_splitter.addWidget(self.left_widget)

        self.player = Player()
        self.left_layout.addWidget(self.player)
        self.left_layout.setStretch(0, 1)

        self.createDisplayFields()

        # Add all of the buttons
        self.allbuttonslayout = QtGui.QHBoxLayout()
        self.allbuttonslayout.setSizeConstraint(QtGui.QLayout.SetNoConstraint)
        self.allbuttonslayout.setObjectName("allbuttonslayout")
        self.gridbuttonlayout = QtGui.QGridLayout()
        self.gridbuttonlayout.setSizeConstraint(QtGui.QLayout.SetFixedSize)
        self.gridbuttonlayout.setVerticalSpacing(1)
        self.gridbuttonlayout.setObjectName("gridbuttonlayout")
        self.DeleteButton = QtGui.QPushButton(self.outer_widget)
        self.DeleteButton.setObjectName("DeleteButton")
        self.gridbuttonlayout.addWidget(self.DeleteButton, 0, 2, 1, 1)
        self.InsertAfterButton = QtGui.QPushButton(self.outer_widget)
        self.InsertAfterButton.setObjectName("InsertAfterButton")
        self.gridbuttonlayout.addWidget(self.InsertAfterButton, 0, 1, 1, 1)
        self.SaveAsButton = QtGui.QPushButton(self.outer_widget)
        self.SaveAsButton.setObjectName("SaveAsButton")
        self.gridbuttonlayout.addWidget(self.SaveAsButton, 1, 1, 1, 1)
        self.CommitAllButton = QtGui.QPushButton(self.outer_widget)
        self.CommitAllButton.setObjectName("CommitAllButton")
        self.gridbuttonlayout.addWidget(self.CommitAllButton, 2, 1, 1, 1)
        self.CommitButton = QtGui.QPushButton(self.outer_widget)
        self.CommitButton.setObjectName("CommitButton")
        self.gridbuttonlayout.addWidget(self.CommitButton, 2, 0, 1, 1)
        self.InsertBeforeButton = QtGui.QPushButton(self.outer_widget)
        self.InsertBeforeButton.setObjectName("InsertBeforeButton")
        self.gridbuttonlayout.addWidget(self.InsertBeforeButton, 0, 0, 1, 1)
        self.SaveButton = QtGui.QPushButton(self.outer_widget)
        self.SaveButton.setObjectName("SaveButton")
        self.gridbuttonlayout.addWidget(self.SaveButton, 1, 0, 1, 1)
        self.RevertButton = QtGui.QPushButton(self.outer_widget)
        self.RevertButton.setObjectName("RevertButton")
        self.gridbuttonlayout.addWidget(self.RevertButton, 2, 2, 1, 1)
        self.allbuttonslayout.addLayout(self.gridbuttonlayout)
        self.keypadGridLayout = QtGui.QGridLayout()
        self.keypadGridLayout.setSizeConstraint(QtGui.QLayout.SetFixedSize)
        self.keypadGridLayout.setObjectName("keypadGridLayout")
        self.SlowerButton = QtGui.QPushButton(self.outer_widget)
        self.SlowerButton.setObjectName("SlowerButton")
        self.keypadGridLayout.addWidget(self.SlowerButton, 2, 0, 1, 1)
        self.FasterButton = QtGui.QPushButton(self.outer_widget)
        self.FasterButton.setObjectName("FasterButton")
        self.keypadGridLayout.addWidget(self.FasterButton, 2, 2, 1, 1)
        self.NormalButton = QtGui.QPushButton(self.outer_widget)
        self.NormalButton.setObjectName("NormalButton")
        self.keypadGridLayout.addWidget(self.NormalButton, 2, 1, 1, 1)
        self.JumpBackButton = QtGui.QPushButton(self.outer_widget)
        self.JumpBackButton.setObjectName("JumpBackButton")
        self.keypadGridLayout.addWidget(self.JumpBackButton, 1, 0, 1, 1)
        self.NextButton = QtGui.QPushButton(self.outer_widget)
        self.NextButton.setObjectName("NextButton")
        self.keypadGridLayout.addWidget(self.NextButton, 0, 2, 1, 1)
        self.JumpForward = QtGui.QPushButton(self.outer_widget)
        self.JumpForward.setObjectName("JumpForward")
        self.keypadGridLayout.addWidget(self.JumpForward, 1, 2, 1, 1)
        self.PlayButton = QtGui.QPushButton(self.outer_widget)
        self.PlayButton.setObjectName("PlayButton")
        self.keypadGridLayout.addWidget(self.PlayButton, 1, 1, 1, 1)
        self.PreviousButton = QtGui.QPushButton(self.outer_widget)
        self.PreviousButton.setObjectName("PreviousButton")
        self.keypadGridLayout.addWidget(self.PreviousButton, 0, 0, 1, 1)
        self.GotoButton = QtGui.QPushButton(self.outer_widget)
        self.GotoButton.setObjectName("GotoButton")
        self.keypadGridLayout.addWidget(self.GotoButton, 0, 1, 1, 1)
        self.SyncButton = QtGui.QPushButton(self.outer_widget)
        self.SyncButton.setObjectName("SyncButton")
        self.keypadGridLayout.addWidget(self.SyncButton, 3, 2, 1, 1)
        self.FillButton = QtGui.QPushButton(self.outer_widget)
        self.FillButton.setObjectName("FillButton")
        self.keypadGridLayout.addWidget(self.FillButton, 3, 0, 1, 1)
        self.allbuttonslayout.addLayout(self.keypadGridLayout)

        self.ExplorerButton = QtGui.QPushButton(self.outer_widget)
        self.ExplorerButton.setObjectName("ExplorerButton")
        self.gridbuttonlayout.addWidget(self.ExplorerButton, 1, 2, 1, 1)

        # Change made by hand here

        self.left_layout.addLayout(self.allbuttonslayout)
        self.left_layout.setStretch(1, 0)
        self.left_layout.setStretch(2, 0)

        # self.splitter = QSplitter()
        # self.splitter.addWidget(self.player)
        # self.outer_layout.addWidget(self.splitter)
        # self.outer_layout.setStretch(1, 1)

        # stepperWindow.show_transcript_in_explorer()
        # if stepperWindow.transcript.video_file_name != None:
        #     self.open_video(stepperWindow.transcript.video_file_name)
        stepperWindow.setCentralWidget(self.outer_widget)

        self.menubar = QtGui.QMenuBar()
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1500, 22))
        self.menubar.setObjectName("menubar")
        stepperWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(stepperWindow)
        self.statusbar.setObjectName("statusbar")
        stepperWindow.setStatusBar(self.statusbar)

        self.retranslateUi(stepperWindow)
        QtCore.QObject.connect(self.GotoButton, QtCore.SIGNAL("clicked()"), stepperWindow.sync_video_and_play)
        QtCore.QObject.connect(self.JumpForward, QtCore.SIGNAL("clicked()"), stepperWindow.jump_forward)
        QtCore.QObject.connect(self.PlayButton, QtCore.SIGNAL("clicked()"), stepperWindow.play_or_pause)
        QtCore.QObject.connect(self.SyncButton, QtCore.SIGNAL("clicked()"), stepperWindow.sync_video)
        QtCore.QObject.connect(self.FillButton, QtCore.SIGNAL("clicked()"), stepperWindow.fill_time_code)
        QtCore.QObject.connect(self.NextButton, QtCore.SIGNAL("clicked()"), stepperWindow.go_to_next_turn)
        QtCore.QObject.connect(self.CommitButton, QtCore.SIGNAL("clicked()"), stepperWindow.commit)
        QtCore.QObject.connect(self.InsertBeforeButton, QtCore.SIGNAL("clicked()"), stepperWindow.insert_before)
        QtCore.QObject.connect(self.JumpBackButton, QtCore.SIGNAL("clicked()"), stepperWindow.jump_back)
        QtCore.QObject.connect(self.SlowerButton, QtCore.SIGNAL("clicked()"), stepperWindow.slower)
        QtCore.QObject.connect(self.FasterButton, QtCore.SIGNAL("clicked()"), stepperWindow.faster)
        QtCore.QObject.connect(self.NormalButton, QtCore.SIGNAL("clicked()"), stepperWindow.normal_speed)
        QtCore.QObject.connect(self.PreviousButton, QtCore.SIGNAL("clicked()"), stepperWindow.go_to_previous_turn)
        QtCore.QObject.connect(self.SaveButton, QtCore.SIGNAL("clicked()"), stepperWindow.save_file)
        QtCore.QObject.connect(self.SaveAsButton, QtCore.SIGNAL("clicked()"), stepperWindow.save_file_as)
        QtCore.QObject.connect(self.RevertButton, QtCore.SIGNAL("clicked()"), stepperWindow.revert_current_and_redisplay)
        QtCore.QObject.connect(self.DeleteButton, QtCore.SIGNAL("clicked()"), stepperWindow.delete_current_turn)
        QtCore.QObject.connect(self.InsertAfterButton, QtCore.SIGNAL("clicked()"), stepperWindow.insert_after)
        QtCore.QObject.connect(self.CommitAllButton, QtCore.SIGNAL("clicked()"), stepperWindow.commit_all)

        # Added this line by hand
        QtCore.QObject.connect(self.ExplorerButton, QtCore.SIGNAL("clicked()"), stepperWindow.show_transcript_in_explorer)

        QtCore.QMetaObject.connectSlotsByName(stepperWindow)

        # The following menu and shortcut stuff added by hand
        command_list = [
            [self.open_transcript, "Open Transcript", {}, "Ctrl+t"],
            [self.open_video, "Open Video", {}, "Ctrl+v"],
            [self.play_or_pause, "Play/Pause", {}, Qt.CTRL + Qt.Key_K],
            [self.save_file, "Save", {}, "Ctrl+s"],
            [self.player.jump_video_backward, "Jump Back", {}, Qt.CTRL + Qt.Key_J],
            [self.player.jump_video_forward, "Jump Forward", {}, Qt.CTRL + Qt.Key_L],
            [self.go_to_previous_turn, "Previous Turn", {}, "Ctrl+u"],
            [self.go_to_next_turn, "Next Turn", {}, "Ctrl+o"],
            [self.go_to_previous_word, "Previous Word", {}, "Ctrl+n"],
            [self.go_to_next_word, "Next Word", {}, "Ctrl+m"]
            ]

        menubar = self.menuBar()
        create_menu(self, menubar, "Stepper", command_list)

        QShortcut(QKeySequence(Qt.CTRL + Qt.Key_0), self, self.play_or_pause)
        QShortcut(QKeySequence(Qt.CTRL + Qt.Key_5), self, self.play_or_pause)
        QShortcut(QKeySequence(Qt.CTRL + Qt.Key_7), self, self.go_to_previous_turn)
        QShortcut(QKeySequence(Qt.CTRL + Qt.Key_9), self, self.go_to_next_turn)
        QShortcut(QKeySequence(Qt.CTRL + Qt.Key_4), self, self.player.jump_video_backward)
        QShortcut(QKeySequence(Qt.CTRL + Qt.Key_6), self, self.player.jump_video_forward)
        QShortcut(QKeySequence(Qt.CTRL + Qt.Key_2), self, self.player.reset_rate)
        QShortcut(QKeySequence(Qt.CTRL + Qt.Key_1), self, self.player.decrease_rate)
        QShortcut(QKeySequence(Qt.CTRL + Qt.Key_3), self, self.player.increase_rate)
        QShortcut(QKeySequence(Qt.CTRL + Qt.Key_I), self, self.sync_video_and_play)
        QShortcut(QKeySequence(Qt.CTRL + Qt.Key_8), self, self.sync_video_and_play)

    def retranslateUi(self, stepperWindow):
        stepperWindow.setWindowTitle(QtGui.QApplication.translate("stepperWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
        self.DeleteButton.setText(QtGui.QApplication.translate("stepperWindow", "Delete", None, QtGui.QApplication.UnicodeUTF8))
        self.InsertAfterButton.setText(QtGui.QApplication.translate("stepperWindow", "Ins After", None, QtGui.QApplication.UnicodeUTF8))
        self.SaveAsButton.setText(QtGui.QApplication.translate("stepperWindow", "Save As ...", None, QtGui.QApplication.UnicodeUTF8))
        self.CommitAllButton.setText(QtGui.QApplication.translate("stepperWindow", "Commit all", None, QtGui.QApplication.UnicodeUTF8))
        self.CommitButton.setText(QtGui.QApplication.translate("stepperWindow", "Commit", None, QtGui.QApplication.UnicodeUTF8))
        self.InsertBeforeButton.setText(QtGui.QApplication.translate("stepperWindow", "Ins Before", None, QtGui.QApplication.UnicodeUTF8))
        self.SaveButton.setText(QtGui.QApplication.translate("stepperWindow", "Save", None, QtGui.QApplication.UnicodeUTF8))
        self.RevertButton.setText(QtGui.QApplication.translate("stepperWindow", "Revert", None, QtGui.QApplication.UnicodeUTF8))
        self.SlowerButton.setText(QtGui.QApplication.translate("stepperWindow", "Slower", None, QtGui.QApplication.UnicodeUTF8))
        self.FasterButton.setText(QtGui.QApplication.translate("stepperWindow", "Faster", None, QtGui.QApplication.UnicodeUTF8))
        self.NormalButton.setText(QtGui.QApplication.translate("stepperWindow", "Normal", None, QtGui.QApplication.UnicodeUTF8))
        self.JumpBackButton.setText(QtGui.QApplication.translate("stepperWindow", "Jump-", None, QtGui.QApplication.UnicodeUTF8))
        self.NextButton.setText(QtGui.QApplication.translate("stepperWindow", "Next", None, QtGui.QApplication.UnicodeUTF8))
        self.JumpForward.setText(QtGui.QApplication.translate("stepperWindow", "Jump+", None, QtGui.QApplication.UnicodeUTF8))
        self.PlayButton.setText(QtGui.QApplication.translate("stepperWindow", "Play", None, QtGui.QApplication.UnicodeUTF8))
        self.PreviousButton.setText(QtGui.QApplication.translate("stepperWindow", "Prev", None, QtGui.QApplication.UnicodeUTF8))
        self.GotoButton.setText(QtGui.QApplication.translate("stepperWindow", "GoTo", None, QtGui.QApplication.UnicodeUTF8))
        self.SyncButton.setText(QtGui.QApplication.translate("stepperWindow", "Sync Vid", None, QtGui.QApplication.UnicodeUTF8))
        self.FillButton.setText(QtGui.QApplication.translate("stepperWindow", "Fill Time", None, QtGui.QApplication.UnicodeUTF8))

        self.ExplorerButton.setText(QtGui.QApplication.translate("stepperWindow", "Explorer", None, QtGui.QApplication.UnicodeUTF8))

    def createDisplayFields(self):
        display_widget = QFrame()
        display_widget.setFrameStyle(QtGui.QFrame.Panel | QtGui.QFrame.Sunken)
        self.left_layout.addWidget(display_widget)
        self.display_layout = QHBoxLayout()

        # self.turn = self.transcript.current_turn()
        self.time_field = qHotField("time", str, "00:00:00", min_size=75, max_size=75, pos="top", handler=self.update_time)
        self.display_layout.addWidget(self.time_field)
        self.speaker_field = qHotField("speaker", str, " ", min_size=75, max_size=75, pos="top", handler=self.update_speaker)
        self.display_layout.addWidget(self.speaker_field)
        self.utt_field = qHotField("utterance", str, " ", min_size=350, max_size=500, pos="top", handler=self.update_utterance, multiline=True)
        self.utt_field.setStyleSheet("font: 14pt \"Courier\";")
        # self.utt_field.efield.setFont(QFont('SansSerif', 12))
        self.display_layout.addWidget(self.utt_field)

        display_widget.setLayout(self.display_layout)
        self.display_layout.setStretchFactor(self.speaker_field, 0)
        self.display_layout.setStretchFactor(self.utt_field, 1)

        self.transcript_slider = QSlider(QtCore.Qt.Horizontal, self)
        self.display_layout.addWidget(self.transcript_slider)
        self.transcript_slider.setMaximum(100)
        self.connect(self.transcript_slider,
                     QtCore.SIGNAL("sliderMoved(int)"), self.position_transcript)
        self.left_layout.addWidget(self.transcript_slider)