python_PyQt5运行股票研究python方法工具V1.0

这篇具有很好参考价值的文章主要介绍了python_PyQt5运行股票研究python方法工具V1.0。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面:

1 在写研究方法过程中(例如:股票研究),很多方法根据数据的更新需要重复运行获取新的结果,本工具就是固化这些需要重复运行的代码,可以直接在工具中运行得到更新的结果。

2 本文是V1.0版本,提供运行python方法的框架,结果显示的控件后续根据研究过程的需要会陆续补充

界面展示:

python_PyQt5运行股票研究python方法工具V1.0,python杂项,python文章来源地址https://www.toymoban.com/news/detail-655564.html

 代码:

日志窗体

class LogShowWidget(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.init_data()
        self.init_ui()
        pass
    def init_data(self):
        self.whole_data:List = []
        self.current_log: str = None
        pass
    def init_ui(self):
        self.setWindowTitle('执行日志')
        self.setMinimumWidth(600)
        self.setMinimumHeight(600)

        pre_btn = QtWidgets.QPushButton('上一个')
        pre_btn.clicked.connect(self.pre_btn_clicked)
        next_btn = QtWidgets.QPushButton('下一个')
        next_btn.clicked.connect(self.next_btn_clicked)

        layout_one = QtWidgets.QHBoxLayout()
        layout_one.addStretch(1)
        layout_one.addWidget(pre_btn)
        layout_one.addWidget(next_btn)
        layout_one.addStretch(1)

        self.log_textedit = QtWidgets.QTextEdit()

        layout = QtWidgets.QVBoxLayout()
        layout.addLayout(layout_one)
        layout.addWidget(self.log_textedit)
        self.setLayout(layout)
        pass
    def set_data(self,data:List):
        self.whole_data.clear()
        self.whole_data = data

        self.current_log = self.whole_data[-1]
        self.fill_log()
        pass
    def pre_btn_clicked(self):
        cur_i = self.whole_data.index(self.current_log)
        if cur_i<=0:
            cur_i = len(self.whole_data)-1
        else:
            cur_i = cur_i -1
        self.current_log = self.whole_data[cur_i]
        self.fill_log()
        pass
    def next_btn_clicked(self):
        cur_i = self.whole_data.index(self.current_log)
        if cur_i >= len(self.whole_data) - 1:
            cur_i = 0
        else:
            cur_i = cur_i + 1
        self.current_log = self.whole_data[cur_i]
        self.fill_log()
        pass
    def fill_log(self):
        self.log_textedit.clear()
        self.log_textedit.setPlainText(self.current_log)
        pass
    pass

 代码执行控件(界面中蓝色框部分)

class ExcuteShowWidget(QtWidgets.QWidget):
    signal_excute = QtCore.pyqtSignal(object)
    def __init__(self):
        super().__init__()

        self.thread_caculate: Thread = None

        self.init_data()
        self.init_ui()
        self.register_event()
        self.progress_init()
        pass
    def init_data(self):
        self.please_select_str: str = '-- 请选择 --'
        self.dir_path: str = ''
        self.log_list: List[str] = []
        self.log_widget: QtWidgets.QWidget = None
        pass
    def init_ui(self):
        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)

        log_btn = QtWidgets.QPushButton('日志')
        log_btn.clicked.connect(self.log_btn_clicked)

        self.code_combox = QtWidgets.QComboBox()
        self.code_combox.addItem(self.please_select_str)

        excute_code_btn = QtWidgets.QPushButton('执行')
        excute_code_btn.clicked.connect(self.excute_code_btn_clicked)
        self.excute_info_label = QtWidgets.QLabel()
        self.excute_info_label.setStyleSheet('QLabel{font-size:18px;color:red;font-weight:bold;}')

        layout_one = QtWidgets.QHBoxLayout()
        layout_one.addWidget(log_btn)
        layout_one.addWidget(self.code_combox)
        layout_one.addWidget(excute_code_btn)
        layout_one.addWidget(self.excute_info_label)

        self.scroll_layout = QtWidgets.QVBoxLayout()
        self.scroll_area = QtWidgets.QScrollArea()
        self.scroll_area.setWidgetResizable(True)

        layout = QtWidgets.QVBoxLayout()
        layout.addLayout(layout_progress)
        layout.addLayout(layout_one)
        layout.addWidget(self.scroll_area)
        self.setLayout(layout)
        pass
    def register_event(self):
        self.signal_excute.connect(self.process_excute_event)
        pass
    def process_excute_event(self,data:Dict):
        mark_str = data['mark_str']
        status = data['status']
        if status == 'success':
            self.excute_info_label.setText(f'{mark_str} 执行成功')

            ret = data['ret']
            target_style = ret['target_style']
            if target_style == 'table':
                # 表格类型结果
                pre_map = {
                    'header':ret['target_header'],
                    'data':ret['target_data']
                }
                node_widget = TableNodeWidget()
                node_widget.set_data(pre_map)
                self.fill_scroll_area([node_widget])
                pass
            elif target_style == 'graph':
                # 图类型
                pre_map = {
                    'data':ret['target_data']
                }
                node_widget = GraphNodeWidget()
                node_widget.set_data(pre_map)
                self.fill_scroll_area([node_widget])
                pass

            self.thread_caculate = None
            self.progress_finished()
            pass
        else:
            self.excute_info_label.setText(f'{mark_str} 失败!失败!')
            now_str = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            log_str = f'{now_str}::{mark_str}::{data["msg"]}'
            self.log_list.append(log_str)

            self.thread_caculate = None
            self.progress_finished()
            pass
        pass

    def excute_code_btn_clicked(self):
        cur_txt = self.code_combox.currentText()
        if not cur_txt or cur_txt == self.please_select_str:
            QtWidgets.QMessageBox.information(
                self,
                '提示',
                '请选择要执行的代码',
                QtWidgets.QMessageBox.Yes
            )
            return
        py_file_path = self.dir_path+ os.path.sep + cur_txt + '.py'
        json_file_path = self.dir_path + os.path.sep + cur_txt + '.json'
        if not os.path.exists(py_file_path):
            QtWidgets.QMessageBox.information(
                self,
                '提示',
                '不存在该py文件',
                QtWidgets.QMessageBox.Yes
            )
            return
        if not os.path.exists(json_file_path):
            QtWidgets.QMessageBox.information(
                self,
                '提示',
                '不存在该json文件',
                QtWidgets.QMessageBox.Yes
            )
            return
        with open(py_file_path,'r',encoding='utf-8') as fr:
            py_code_str = fr.read()
        try:
            with open(json_file_path,'r',encoding='utf-8') as fr:
                json_obj = json.load(fr)
        except Exception as e:
            QtWidgets.QMessageBox.information(
                self,
                '报错',
                e.__str__(),
                QtWidgets.QMessageBox.Yes
            )
            return
        self.start_caculate_thread(cur_txt,{'py_code':py_code_str,'json_obj':json_obj})
        pass
    def set_target_combox_data(self,data:List,dir_path:str):
        self.dir_path = dir_path
        self.code_combox.clear()
        self.code_combox.addItem(self.please_select_str)
        self.code_combox.addItems(data)
        pass
    def log_btn_clicked(self):
        if not self.log_widget:
            self.log_widget = LogShowWidget()
        self.log_widget.set_data(self.log_list)
        self.log_widget.show()
        pass
    def fill_scroll_area(self,widget_list:List):
        while self.scroll_layout.count():
            item = self.scroll_layout.takeAt(0)
            widget = item.widget()
            if widget is not None:
                widget.deleteLater()
            pass
        sc_child_widget = self.scroll_area.takeWidget()
        if sc_child_widget is not None:
            sc_child_widget.deleteLater()
        for item in widget_list:
            self.scroll_layout.addWidget(item)
        one_sc_child_widget = QtWidgets.QWidget()
        one_sc_child_widget.setLayout(self.scroll_layout)
        self.scroll_area.setWidget(one_sc_child_widget)
        pass

    def start_caculate_thread(self,mark_str:str,data:Dict[str,Any]):
        if self.thread_caculate:
            QtWidgets.QMessageBox.information(
                self,
                '提示',
                '线程正在执行任务,请稍后。。。',
                QtWidgets.QMessageBox.Yes
            )
            return
        self.thread_caculate = Thread(
            target=self.running_caculate_thread,
            args=(
                mark_str, data,
            )
        )
        self.thread_caculate.start()
        self.progress_busy()
        pass
    def running_caculate_thread(self,mark_str:str,data:Dict[str,Any]):
        py_code = data['py_code']
        json_obj = data['json_obj']
        try:
            namespace = {}
            fun_code = compile(py_code,'<string>','exec')
            exec(fun_code,namespace)
            ret = namespace['excute_code'](json_obj)

            res_map = {
                'mark_str':mark_str,
                'status':'success',
                'ret':ret
            }
            self.signal_excute.emit(res_map)
        except Exception as e:
            res_map = {
                'mark_str':mark_str,
                'status':'error',
                'msg':e.__str__()
            }
            self.signal_excute.emit(res_map)
        pass
    def 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('执行完毕')
        pass
    def closeEvent(self, a0: QtGui.QCloseEvent) -> None:
        if self.log_widget:
            self.log_widget.close()
        self.close()
        pass

主界面

class StockAnalysisMainWidget(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.init_data()
        self.init_ui()
        pass
    def init_data(self):
        self.code_py_list:List = []
        pass
    def init_ui(self):
        self.setWindowTitle('PyQt5运行股票研究python方法工具V1.0')

        code_py_dir_btn = QtWidgets.QPushButton('代码py文件目录')
        code_py_dir_btn.clicked.connect(self.code_py_dir_btn_clicked)
        self.code_py_dir_lineedit = QtWidgets.QLineEdit()
        tip_label = QtWidgets.QLabel('提示:json文件为参数文件,同一业务json和py文件同名')

        layout_one = QtWidgets.QFormLayout()
        layout_one.addRow(code_py_dir_btn,self.code_py_dir_lineedit)
        layout_one.addWidget(tip_label)

        copy_one_widget_btn = QtWidgets.QPushButton('复制窗体')
        copy_one_widget_btn.clicked.connect(self.copy_one_widget_btn_clicked)

        layout_two = QtWidgets.QHBoxLayout()
        layout_two.addWidget(copy_one_widget_btn)
        layout_two.addStretch(1)

        layout_three = QtWidgets.QVBoxLayout()
        layout_three.addLayout(layout_one)
        layout_three.addLayout(layout_two)

        # 分界线 s
        h_line = QtWidgets.QFrame()
        h_line.setFrameShape(QtWidgets.QFrame.HLine)
        h_line.setFrameShadow(QtWidgets.QFrame.Sunken)
        # 分界线 e

        self.excute_show_widget = ExcuteShowWidget()

        layout = QtWidgets.QVBoxLayout()
        layout.addLayout(layout_three)
        layout.addWidget(h_line)
        layout.addWidget(self.excute_show_widget)
        self.setLayout(layout)
        pass
    def code_py_dir_btn_clicked(self):
        path = QtWidgets.QFileDialog.getExistingDirectory(
            self,
            '打开py和json文件所在目录',
            '.'
        )
        if not path:
            return
        self.code_py_list.clear()
        py_file_list = os.listdir(path)
        for item in py_file_list:
            if item.endswith('.py'):
                self.code_py_list.append(item[0:-3])
        self.code_py_dir_lineedit.setText(path)
        self.excute_show_widget.set_target_combox_data(self.code_py_list,path)
        pass
    def copy_one_widget_btn_clicked(self):
        pass
    pass

执行代码:

if __name__ == '__main__':
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)
    app = QtWidgets.QApplication(sys.argv)
    main_window = StockAnalysisMainWidget()
    main_window.showMaximized()
    app.exec()
    pass

到了这里,关于python_PyQt5运行股票研究python方法工具V1.0的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python GUI工具之PyQt5模块,pyCharm 配置PyQt5可视化窗口

    https://doc.qt.io/qt-5/qtwidgets-module.html https://doc.qt.io/qt-5/qt.html#AlignmentFlag-enum 一、简介 PyQt是Qt框架的Python语言实现,由Riverbank Computing开发,是最强大的GUI库之一。PyQt提供了一个设计良好的窗口控件集合,每一个PyQt控件都对应一个Qt控件。 PyQt5是由一系列Python模块组成,有超过6

    2024年02月11日
    浏览(50)
  • 关于为在手机上开发/运行Python程序的研究报告以及为手机打包Python应用的研究。

    前一段时间莫名地想用Python开发手机应用。经过日日夜夜在互联网上的挖掘于是有了这样一篇导航性的文章兼入坑/踩坑记录。必须承认Python在手机领域的进展还停留在研发阶段,作者也是真心希望更多的大佬参与到这个领域的先驱部队中,开发出一款完备的引擎之类的。 如

    2024年02月14日
    浏览(63)
  • Python——Pyqt5的数据可视化小工具(完整代码)

    作业要求:【都已经打包放网上了,有缘人需要就自取】 一份报告书 (在全球变暖背景下碳中和对各国的二氧化碳排放量的影响项目报告书) 一份代码 作业包: python数据可视化小工具.zip - 蓝奏云 大一的时候,当时的python作业,交完作业后,忘记记录了(难受.jpg) 现在大

    2024年02月02日
    浏览(48)
  • 数据库系统课设——基于python+pyqt5+mysql的酒店管理系统(可直接运行)--GUI编程

    几个月之前写的一个项目,通过这个项目,你能学到关于数据库的触发器知识,python的基本语法,python一些第三方库的使用,包括python如何将前后端连接起来(界面和数据),还有界面的设计等等。希望大家能从项目中学到东西。 宾馆管理系统通过提供顾客和员工信息之间的

    2024年02月05日
    浏览(48)
  • 数据库系统课设——基于python+pyqt5+mysql的酒店管理系统(可直接运行)--GUI编程(2)

     几个月之前写的一个项目,通过这个项目,你能学到关于数据库的触发器知识,python的基本语法,python一些第三方库的使用,包括python如何将前后端连接起来(界面和数据),还有界面的设计等等。希望大家能从项目中学到东西。 宾馆管理系统通过提供顾客和员工信息之间

    2024年02月03日
    浏览(54)
  • 基于pyqt5、mysql、yolov7、chatgpt的小麦病害检测系统v1.0

    运行 Python安装目录下 Scriptspyqt5designer.exe 这个可执行文件 1.2创建用户主窗体 进入设计界面创建一个main window 拖动添加控件,创建用户主窗体 具体每个控件怎么使用可以咨询:robot 创建 qdockwidget ,拖动添加控件,创建用户子窗体——检测功能窗体 ……创建其他功能子窗体 进

    2024年02月09日
    浏览(45)
  • 【丐版JDK管理工具-Daen-JDKMAN-V1.0】Python实现JDK多版本切换管理工具V1.0,已打包成EXE

    🧑‍💻作者名称:DaenCode 🎤作者简介:CSDN实力新星,后端开发两年经验,曾担任甲方技术代表,业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开发。技术尚浅,闭关学习中······ 😎人生感悟:尝尽人生百味,方知世间冷暖。

    2024年02月07日
    浏览(42)
  • Python PyQt5——QThread使用方法与代码实践

    在 GUI 程序中,如果想要让程序执行一项耗时的工作,例如下载文件、I/O 存取等,深度学习模型推理,直接在 UI 线程中进行这些操作会导致整个界面卡住,出现无响应的状态。为了避免这种情况,可以将这些耗时任务放在另一个线程中执行。在 PyQt 中,可以使用 QThread 来实现

    2024年04月27日
    浏览(31)
  • python--pyQt5 页面刷新\线程刷新\界面卡顿 --- 多线程处理(线程的开始/暂停/恢复/取消)同时运行两个不同的线程 pyside6

    参考:https://blog.csdn.net/zx520113/article/details/86598658 PyQt5中使用QTimer定时刷新:当要执行可能会超过设定时间的代码 刷新界面命令:QApplication.processEvents() 对于执行很耗时的程序来说,由于PyQt需要等待程序执行完毕才能进行下一步,这个过程表现在界面上就是卡顿,而如果需要

    2024年03月25日
    浏览(46)
  • python中的yolov5结合PyQt5,使用QT designer设计界面没正确启动的解决方法

    一、窗体设计test: 默认你已经设计好了窗体后: 这时你需要的是保存生成的untitle.ui到某个文件夹下,然后在命令行中奖.ui转换为.py(,通过​​pyqt5​​​提供的转换工具,将​​ui​​​文件转换成​​python​​的代码) 或者使用在PyCharm中安装的工具: 然后你会看到mai

    2024年02月07日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包