class MainWindow(QtWidgets.QMainWindow, uic.loadUiType('data/planner.ui')[0]): def __init__(self): global main super().__init__() main = self self.setupUi(self) self.submit.clicked.connect(self.on_input) self.data_edit.returnPressed.connect(self.submit.click) self.storage_manager = StorageManager() self.storage_manager.start() self.music_player = MusicPlayer() self.music_player.start() self.scheduler = Scheduler(self) self.scheduler.start() self.log_units = [ self.storage_manager, self.music_player, self.scheduler ] self.checkbox_list = [] for k in range(16): self.checkbox_list.append(getattr(self, f'checkbox_list_item{k}')) def get_checkbox_handler(checkbox, k, callback): return lambda: callback(checkbox, k) for k, log_unit in enumerate(self.log_units): self.checkbox_list[k].setText(log_unit.log_header) self.checkbox_list[k].setChecked(True) self.checkbox_list[k].toggled.connect( get_checkbox_handler(self.checkbox_list[k], k, self.on_toggle_checkbox)) self.checkbox_list_autoscroll.setChecked(True) self.console_log = QStringListModel() self.console.setModel(self.console_log) self.schedule_tree.setHeaderLabels(['일자', '시간', '행동']) for head in entire_schedule: header = QTreeWidgetItem([head]) for tail_time in entire_schedule[head]: header.addChild( QTreeWidgetItem([ None, str(tail_time), entire_schedule[head][tail_time] ])) self.schedule_tree.addTopLevelItem(header) header.setExpanded(True) self.schedule_tree.doubleClicked.connect( self.on_double_click_schedule_tree) for k, macro_name in enumerate(quick_macros): create_quick_macro_button(k, macro_name, quick_macros[macro_name]) self.log_timer = QTimer() self.log_timer.setInterval(1000) self.log_timer.timeout.connect(self.on_check_log) self.log_timer.start() self.show() def closeEvent(self, c): print('Closing...') self.log_timer.stop() for log_unit in self.log_units: log_unit.close() log_unit.quit() def insert_log(self, log: str): row = self.console_log.rowCount() self.console_log.insertRow(row) index = self.console_log.index(row) print(log) self.console_log.setData(index, log) @pyqtSlot(QModelIndex) def on_double_click_schedule_tree(self, index): try: key = index.model().data(index, 2) if key is not None: self.parse_command(f'-{key}') except: self.insert_log(traceback.format_exc()) @pyqtSlot() def on_toggle_checkbox(self, check_box, k): if k < len(self.log_units): self.log_units[k].log_enable = check_box.isChecked() @pyqtSlot() def on_input(self): text = self.data_edit.text() self.parse_command(text.lower()) self.console.scrollToBottom() self.data_edit.setText('') for k, method_name in enumerate(quick_macros): button = getattr(self, f'button_list_item{k}') print(button.x(), button.y()) @pyqtSlot() def on_check_log(self): logs_to_insert = [] for k, log_unit in enumerate(self.log_units): if log_unit.is_empty(): continue for log in log_unit.flush_log(): logs_to_insert.append(log) if len(logs_to_insert) > 0: logs_to_insert.sort(key=lambda x: x[0]) for log in logs_to_insert: self.insert_log('%02d:%02d: %s' % (log[0].hour, log[0].minute, log[1].replace( os.getcwd(), '$://'))) if self.checkbox_list_autoscroll.isChecked(): self.console.scrollToBottom() @pyqtSlot(str) def parse_command(self, command: str): self.insert_log(f'>> {command}') try: if command == 'test': self.music_player.music_pause() self.music_player.play_unstoppable_music('audio/테스트.mp3') self.music_player.music_resume() elif command == 'get_musics': with self.storage_manager.lock: log = '=================현재 기상송===============\n' for file_path in self.storage_manager.files_to_play: log += file_path + '\n' log += '=========================================' self.insert_log(log) elif command == 'all_around_test': self.scheduler.all_around_test() elif command == 'abort_song': self.music_player.close() elif command.startswith('-'): self.scheduler.push_tag_command(command[1:]) else: self.insert_log(f'?? {command}') except: self.insert_log(traceback.format_exc()) self.insert_log(f'<< {command}')