def __init__(self, parent=None):
        QWidget.__init__(self)
        self.setupUi(self)
        self.setWindowTitle(
            QApplication.translate("Widget", "%s %s" % (__app_name__, __version__), None, QApplication.UnicodeUTF8))
        # 最前面に表示
        self.setWindowFlags(Qt.WindowStaysOnTopHint)
        # 一対比較クラスの生成
        self.pair_com = PairedComparison()

        # 評価ファイル群(list)
        self.wav_filepath_s = []

        # 現在の対戦番号
        self.game_index = 0
        self.game_max_index = -1
        # 対戦表のランダム変換テーブル
        self.random_index = []

        # 再生マネージャー
        self.audio_mgr_left = AudioManager()
        self.audio_mgr_right = AudioManager()

        # 再生条件
        self.volume = 0
        self.channel = 'mono'

        self.init_ui()
class GUI(QWidget, Ui_Widget):
    def __init__(self, parent=None):
        QWidget.__init__(self)
        self.setupUi(self)
        self.setWindowTitle(
            QApplication.translate("Widget", "%s %s" % (__app_name__, __version__), None, QApplication.UnicodeUTF8))
        # 最前面に表示
        self.setWindowFlags(Qt.WindowStaysOnTopHint)
        # 一対比較クラスの生成
        self.pair_com = PairedComparison()

        # 評価ファイル群(list)
        self.wav_filepath_s = []

        # 現在の対戦番号
        self.game_index = 0
        self.game_max_index = -1
        # 対戦表のランダム変換テーブル
        self.random_index = []

        # 再生マネージャー
        self.audio_mgr_left = AudioManager()
        self.audio_mgr_right = AudioManager()

        # 再生条件
        self.volume = 0
        self.channel = 'mono'

        self.init_ui()

    def init_ui(self):
        """
        評価項目を自動生成
        ※ 必ずself.pair_comを生成した後作る。評価項目数が分からないといけない。
        """

        # # ほぼおまじない

        # QtDesignerで作った要素を削除
        self.groupBox_eval_1.deleteLater()
        self.groupBox_eval_2.deleteLater()
        self.groupBox_eval_3.deleteLater()
        verticalLyaout = self.groupBox_eval.layout()

        # UIを生成(RadioBox)
        eval_name = self.pair_com.get_evalutions()
        radiobox_num = len(eval_name)

        # radioオブジェクト用配列
        groupBox_s = []
        radioButton_eval_s = [[]]

        # UI要素の生成
        for i in range(radiobox_num):
            # self.groupBox_evaを親にして、子供のQGroupBoxを生成
            groupBox_s.append(QGroupBox(self.groupBox_eval))

            groupBox_s[i].setTitle(QApplication.translate("Widget", eval_name[i], None, QApplication.UnicodeUTF8))

            horizontalLayout = QHBoxLayout(groupBox_s[i])
            radioButton_eval_s.append([])

            # Radioボタンを横並びに追加(horizontalLayout)
            for j in range(3):
                obj_name = ['左', 'どちらでもない', '右']
                radioButton_eval_s[i].append(QRadioButton(groupBox_s[i]))
                radioButton_eval_s[i][j].setText(
                    QApplication.translate("Widget", obj_name[j], None, QApplication.UnicodeUTF8))
                horizontalLayout.addWidget(radioButton_eval_s[i][j])
            verticalLyaout.addWidget(groupBox_s[i])

        # シグナルコネクト
        for radio_box_no in range(radiobox_num):
            for radio_btn_no in range(3):
                QObject.connect(radioButton_eval_s[radio_box_no][radio_btn_no], SIGNAL("clicked()"),
                                self.judge_evalution)

        # 評価値を変更するLineEditとコネクト
        for radio_box_no in range(radiobox_num):
            QObject.connect(self.lineEdit_eval1, SIGNAL("textChanged(QString)"), groupBox_s[0].setTitle)
            QObject.connect(self.lineEdit_eval2, SIGNAL("textChanged(QString)"), groupBox_s[1].setTitle)
            QObject.connect(self.lineEdit_eval3, SIGNAL("textChanged(QString)"), groupBox_s[2].setTitle)

        # UI操作ように格納
        self.UI_groupBox_s = groupBox_s
        self.UI_radioButton_ss = radioButton_eval_s

    # 評価項目を保存
    def set_evalutions(self):
        """評価用語のテキストをset (save前までにpair_comに渡しておけばよい)"""
        evals = []
        for group_box in self.UI_groupBox_s:
            s = group_box.title()
            evals.append(group_box.title())
        self.pair_com.set_evalutions(evals)

    def init_game(self):
        """
        一対比較の状態を初期化
        (これ以降は評価項目を変えてはいけない. Tableサイズが変わってしまう)
        """
        # 評価するwavデータをセット
        self.pair_com.set_files(file_s=self.wav_filepath_s)
        # テーブルを生成
        self.pair_com.make_table()
        # 総当たり数を取得
        self.game_max_index = self.pair_com.get_pair_num()

        # 対戦表をランダムにする
        self.random_index = range(self.game_max_index)
        if RANDOM_FLG:
            random.shuffle(self.random_index)

            # 評価項目のUIを生成
            # self.init_ui()

    def updateGame(self):

        # 対戦表のインデックス
        # index = self.game_index
        index = self.random_index[self.game_index]
        # 対戦ペアを取得
        pair = self.pair_com.get_pair(index)
        assert pair['index'] == index
        # 対戦ファイルのインデックス
        left_n = pair['left']
        right_n = pair['right']

        # 再生ファイル
        wav_left = self.wav_filepath_s[left_n]
        wav_right = self.wav_filepath_s[right_n]

        # 再生デバイスのセット
        self.audio_mgr_left.set_wav(wav_left)
        self.audio_mgr_right.set_wav(wav_right)

        # -- GUI更新 ---------------------------------------
        # ゲーム数を表示(あると面倒さを感じてつまらない)
        self.label_game_number.setText('%d/%d' % (self.game_index + 1, self.game_max_index))

        # ファイル名の表示
        left_file_name = os.path.basename(self.wav_filepath_s[left_n])
        self.label_name_left.setText(left_file_name)
        right_file_name = os.path.basename(self.wav_filepath_s[right_n])
        self.label_name_right.setText(right_file_name)

        # RadioButtonの更新
        # 対戦結果を呼び出して、radioボタンを更新
        radio_box_num = len(self.UI_groupBox_s)
        for radio_box_no in range(radio_box_num):
            # 左の音の勝敗を呼び出す
            issue, pair_index = self.pair_com.get_issue(table_index=radio_box_no, index=index)
            # 状態毎にCheckを付けるradioボタンを選択
            if issue == 1:
                radio_btn_no = 0
            elif issue == 0:
                radio_btn_no = 1
            elif issue == -1:
                radio_btn_no = 2
            else:
                radio_btn_no = None
            # radioボタンのチェック
            self.UI_radioButton_ss[radio_box_no][radio_btn_no].setChecked(True)

        # プログレスバーの更新
        prog_val = int((self.game_index + 1.) / float(self.game_max_index) * 100)
        self.progressBar.setValue(prog_val)

        # 評価用語のテキストをset (save前までにpair_comに渡しておけばよい)
        self.set_evalutions()

    @Slot()
    def judge_evalution(self):
        """
        勝敗判定
        """
        logger.debug('>judge_evalution')
        index = self.random_index[self.game_index]

        # 各radioボックス毎に勝敗判定し、pair_comオブジェクトに格納
        for table_index in range(len(self.UI_groupBox_s)):
            win_left = self.UI_radioButton_ss[table_index][0].isChecked()
            win_center = self.UI_radioButton_ss[table_index][1].isChecked()
            win_right = self.UI_radioButton_ss[table_index][2].isChecked()
            if win_left:
                self.pair_com.set_issue(table_index=table_index, index=index, win='left')
            elif win_center:
                self.pair_com.set_issue(table_index=table_index, index=index, win='draw')
            elif win_right:
                self.pair_com.set_issue(table_index=table_index, index=index, win='right')

    @Slot()
    def play_left_sound(self):
        """左の音源を再生"""
        logger.debug('>play_left_sound')
        self.audio_mgr_left.play(volume=self.volume, channel=self.channel)
        pass

    @Slot()
    def play_right_sound(self):
        """右の音源を再生"""
        logger.debug('>play_right_sound')
        self.audio_mgr_right.play(volume=self.volume, channel=self.channel)
        pass

    @Slot()
    def play_channel_mono(self):
        self.channel = 'mono'

    @Slot()
    def play_channel_left(self):
        self.channel = 'left'

    @Slot()
    def play_channel_right(self):
        self.channel = 'right'

    @Slot()
    def play_channel_stereo(self):
        self.channel = 'stereo'

    @Slot()
    def play_volume(self, value):
        self.volume = value

    @Slot()
    def game_update_next(self):
        if self.game_index + 1 < self.game_max_index:
            self.game_index += 1
            logger.debug('>game_update_next')
            self.updateGame()
        pass

    @Slot()
    def game_update_back(self):
        if self.game_index - 1 >= 0:
            self.game_index -= 1
            logger.debug('>game_update_back')
            self.updateGame()

        pass

    @Slot()
    def game_save(self):

        # OSを判定し、文字コードを取得
        if os.name is 'nt':
            code = 'cp932'
        else:
            code = 'utf-8'

        # 評価用語のテキストをset (save前までにpair_comに渡しておけばよい)
        self.set_evalutions()

        logger.debug('>game_save')

        # save as ダイアログ
        filename, ext = QFileDialog.getSaveFileName(self, "Save file", "", ".csv")

        # 勝敗データを保存
        self.pair_com.save(filename)

        # UNICODE文字列から、OSに合わせてエンコード:文字化け回避
        filename_ = filename.encode(code)
        # エクスプローラをオープン
        cmd_file = 'explorer /select, "%s"' % (os.path.normpath(filename_))
        Popen(cmd_file)

    @Slot()
    def file_load(self):
        """
        Dialogをオープンし評価するファイルを格納
        """
        logger.debug('>file_load')

        if OPEN_METHOD is 'dir':
            # フォルダ選択ダイアログ
            dir = QFileDialog.getExistingDirectory(self, 'Open dir', './')
            # ディレクトリからwavファイルを検索
            search_path = os.path.join(dir, '*.wav')
            # プロパティに格納
            self.wav_filepath_s = glob.glob(search_path)
            # デバッグ
            logger.debug('>file_load: dir=%s', dir)
        else:
            # 複数ファイル選択ダイアログ
            fname_s, filter = QFileDialog.getOpenFileNames(self, 'Open file', './',
                                                           'Wave Files (*.wav);; All Files (*)')
            self.wav_filepath_s = fname_s

        # デバッグ
        logger.debug('>file_load: fname=%s', self.wav_filepath_s)

        # テストでとりあえずここで呼び出し
        self.init_game()
        self.updateGame()

        pass

    def keyPressEvent(self, event):
        """子供ウィジェットの場合は、無効"""
        e = event.key()
        print e

        if e == Qt.Key_Up:
            pass
        elif e == Qt.Key_Down:
            pass

        elif e == Qt.Key_Left:
            self.play_left_sound()

        elif e == Qt.Key_Right:
            self.play_right_sound()

        elif e == Qt.Key_Plus:
            pass
        elif e == Qt.Key_Minus:
            pass
        elif e == Qt.Key_Q:
            # self.close()
            pass
        elif e == Qt.Key_E:
            self.play_left_sound()

        elif e == Qt.Key_R:
            self.play_right_sound()

        else:
            pass

        self.update()