目录
写在前面
界面图示
编辑 代码
执行代码
写在前面
本文默认已经创建了项目,如果不知道如何创建一个空项目的,请参看以下两篇博文
PyQt5将项目搬到一个新的虚拟环境中
https://blog.csdn.net/m0_37967652/article/details/122625280
python_PyQt5开发工具结构基础
https://blog.csdn.net/m0_37967652/article/details/131969032
界面图示
代码
class DailyUpdateWidget(QtWidgets.QWidget):signal_excute = QtCore.pyqtSignal(object)def __init__(self):super().__init__()self.thread: Thread = Noneself.init_data()self.init_ui()self.register_event()self.init_start()passdef init_data(self):self.left_table_headers = ['品种代码', '合约', '交割年', '最新日期']passdef init_ui(self):self.setWindowTitle('日数据更新(优矿)')self.setMinimumHeight(600)self.setMinimumWidth(800)self.caculate_progress = QtWidgets.QProgressBar()self.caculate_status_label = QtWidgets.QLabel()layout_progress = QtWidgets.QHBoxLayout()layout_progress.addWidget(self.caculate_progress)layout_progress.addWidget(self.caculate_status_label)deliYear_tip = QtWidgets.QLabel('设置计算要使用的交割年份:')self.deliYear_spinbox = QtWidgets.QSpinBox()self.deliYear_spinbox.setMinimum(1900)self.deliYear_spinbox.setMaximum(9999)self.deliYear_spinbox.setValue(datetime.datetime.now().year)layout_one = QtWidgets.QHBoxLayout()layout_one.addWidget(deliYear_tip)layout_one.addWidget(self.deliYear_spinbox)layout_one.addStretch(1)choice_symbol_dir_btn = QtWidgets.QPushButton('选择合约所在目录')choice_symbol_dir_btn.clicked.connect(self.choice_symbol_dir_btn_clicked)self.choice_symbol_dir_lineedit = QtWidgets.QLineEdit()self.choice_symbol_dir_lineedit.setReadOnly(True)excute_step_one_btn = QtWidgets.QPushButton('执行')excute_step_one_btn.clicked.connect(self.excute_step_one_btn_clicked)layout_two = QtWidgets.QHBoxLayout()layout_two.addWidget(choice_symbol_dir_btn)layout_two.addWidget(self.choice_symbol_dir_lineedit)layout_two.addWidget(excute_step_one_btn)self.new_symbol_json_down_btn = QtWidgets.QPushButton('新增合约json下载')self.new_symbol_json_down_btn.clicked.connect(self.new_symbol_json_down_btn_clicked)self.append_symbol_json_down_btn = QtWidgets.QPushButton('追加合约json下载')self.append_symbol_json_down_btn.clicked.connect(self.append_symbol_json_down_btn_clicked)self.new_symbol_json_down_btn.setDisabled(True)self.append_symbol_json_down_btn.setDisabled(True)layout_three = QtWidgets.QHBoxLayout()layout_three.addWidget(self.new_symbol_json_down_btn)layout_three.addWidget(self.append_symbol_json_down_btn)choice_symbol_dir_label = QtWidgets.QLabel('提示:从优矿中下载最新的合约列表,放在一个目录中,选择该目录。执行完后,下载要更新的合约json文件')# 分界线 sh_line_one = QtWidgets.QFrame()h_line_one.setFrameShape(QtWidgets.QFrame.HLine)h_line_one.setFrameShadow(QtWidgets.QFrame.Sunken)# 分界线 eself.choice_daily_dir_btn = QtWidgets.QPushButton('选择日数据所在目录')self.choice_daily_dir_btn.clicked.connect(self.choice_daily_dir_btn_clicked)self.choice_daily_dir_btn.setDisabled(True)self.choice_daily_dir_lineedit = QtWidgets.QLineEdit()self.choice_daily_dir_lineedit.setReadOnly(True)excute_step_two_btn = QtWidgets.QPushButton('执行')excute_step_two_btn.clicked.connect(self.excute_step_two_btn_clicked)layout_four = QtWidgets.QHBoxLayout()layout_four.addWidget(self.choice_daily_dir_btn)layout_four.addWidget(self.choice_daily_dir_lineedit)layout_four.addWidget(excute_step_two_btn)choice_daily_dir_label = QtWidgets.QLabel('提示:从优矿在下载待更新的日数据,放在一个目录中,选择该目录')# 分界线 sh_line_two = QtWidgets.QFrame()h_line_two.setFrameShape(QtWidgets.QFrame.HLine)h_line_two.setFrameShadow(QtWidgets.QFrame.Sunken)# 分界线 etip_label = QtWidgets.QLabel('当前在线合约:')refresh_btn = QtWidgets.QPushButton('刷新')refresh_btn.clicked.connect(self.refresh_btn_clicked)download_btn = QtWidgets.QPushButton('下载')download_btn.clicked.connect(self.download_btn_clicked)layout_five = QtWidgets.QHBoxLayout()layout_five.addWidget(tip_label)layout_five.addStretch(1)layout_five.addWidget(refresh_btn)layout_five.addWidget(download_btn)self.left_table = QtWidgets.QTableWidget()self.left_table.setColumnCount(len(self.left_table_headers))self.left_table.setHorizontalHeaderLabels(self.left_table_headers)layout_six = QtWidgets.QVBoxLayout()layout_six.addLayout(layout_five)layout_six.addWidget(self.left_table)log_label = QtWidgets.QLabel('日志:')self.log_textedit = QtWidgets.QTextEdit()self.log_textedit.setReadOnly(True)layout_seven = QtWidgets.QVBoxLayout()layout_seven.addWidget(log_label)layout_seven.addWidget(self.log_textedit)layout_eight = QtWidgets.QHBoxLayout()layout_eight.addLayout(layout_six)layout_eight.addLayout(layout_seven)layout = QtWidgets.QVBoxLayout()layout.addLayout(layout_progress)layout.addLayout(layout_one)layout.addLayout(layout_two)layout.addLayout(layout_three)layout.addWidget(choice_symbol_dir_label)layout.addWidget(h_line_one)layout.addLayout(layout_four)layout.addWidget(choice_daily_dir_label)layout.addWidget(h_line_two)layout.addLayout(layout_eight)self.setLayout(layout)passdef register_event(self):self.signal_excute.connect(self.process_excute_event)passdef process_excute_event(self,data:Dict):mark_str = data['mark_str']passdef init_start(self):self.progress_init()passdef choice_symbol_dir_btn_clicked(self):passdef excute_step_one_btn_clicked(self):passdef new_symbol_json_down_btn_clicked(self):passdef append_symbol_json_down_btn_clicked(self):passdef choice_daily_dir_btn_clicked(self):passdef excute_step_two_btn_clicked(self):passdef refresh_btn_clicked(self):passdef download_btn_clicked(self):passdef start_caculate_thread(self,mark_str:str,data:Dict[str,Any]=None):if self.thread:QtWidgets.QMessageBox.information(self,'提示','线程正在执行任务,请稍后...',QtWidgets.QMessageBox.Yes)returnself.thread = Thread(target=self.running_caculate_thread,args=(mark_str,data,))self.thread.start()self.progress_busy()passdef running_caculate_thread(self,mark_str:str,data:Dict[str,Any]):passdef progress_init(self) -> None:self.caculate_progress.setValue(0)self.caculate_status_label.setText('无任务')def progress_busy(self) -> None:self.caculate_progress.setRange(0, 0)self.caculate_status_label.setText('正在执行')def progress_finished(self) -> None:self.caculate_progress.setRange(0, 100)self.caculate_progress.setValue(100)self.caculate_status_label.setText('执行完毕')passdef closeEvent(self, a0: typing.Optional[QtGui.QCloseEvent]) -> None:self.close()pass
执行代码
if __name__ == '__main__':QtCore.QCoreApplication.setAttribute(QtCore.Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)app = QtWidgets.QApplication(sys.argv)main_window = DailyUpdateWidget()main_window.show()app.exec()pass