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()