【Python】Pyside2 可视化实现:每秒复制源文件一行到目标文件并打印日志

news2024/11/19 1:50:51

背景:

博主在某个项目中,需要模拟每秒钟生成一行数据,所以有了该博客的想法,其中有线程的内容,为了防止主界面卡住

效果:

在这里插入图片描述

代码:

import sys
import threading
import time

import openpyxl
import pandas as pd
from PySide2.QtWidgets import QApplication, QWidget, QFileDialog
from PySide2.QtUiTools import QUiLoader
from PySide2.QtCore import QFile, QIODevice

sourceFilePath = ""     # 源文件路径
targetFilePath = ""     # 目标文件路径
source_data = None      # 源文件数据


class MyWindow:
    def __init__(self):
        # 从文件中加载UI定义
        self.load_ui()
        # 绑定事件
        # 给 选择源文件 按钮 绑定事件
        self.ui.btn_selectSourceFile.clicked.connect(self.click_selectSourceFile)
        # 给 选择目标文件 按钮 绑定事件
        self.ui.btn_selectTargetFile.clicked.connect(self.click_selectTargetFile)
        # 给 开始复制 按钮 绑定事件
        self.ui.btn_runCopy.clicked.connect(self.click_runCopy)
        # 连接文本编辑器的文本变化信号到滚动到底部的槽
        self.ui.textEdit_log.textChanged.connect(self.scroll_to_bottom)

    def load_ui(self):
        # 从文件中加载UI定义
        ui_file_name = 'UI/WriteMain.ui'
        ui_file = QFile(ui_file_name)
        if not ui_file.open(QIODevice.ReadOnly):
            print(f"Cannot open {ui_file_name}: {ui_file.errorString()}")
            sys.exit(-1)
        # 从 UI 定义中动态 创建一个相应的窗口对象
        # 注意:里面的控件对象也成为窗口对象的属性了
        # 比如 self.ui.button , self.ui.textEdit
        loader = QUiLoader()
        self.ui = loader.load(ui_file)
        ui_file.close()
        if not self.ui:
            print(loader.errorString())
            sys.exit(-1)

    # 选择源文件 按钮 单击事件
    def click_selectSourceFile(self):
        global sourceFilePath, source_data
        file_name = QFileDialog.getOpenFileName(self.ui, "选择源文件", "../Data",
                                                'Excel files (*.xls *.xlsx);; All files (*)')  # 选择文件,返回选中的文件路径
        print(file_name)

        if file_name:
            file_name = file_name[0]
            self.file_name = file_name
            # 根据文件类型读取数据
            if file_name.endswith('.xls') or file_name.endswith('.xlsx'):
                sourceFilePath = file_name
                # 读取Excel文件
                # source_data = pd.read_excel(file_name)
                # print(source_data)
                self.ui.lineEdit_sourcePath.setText(file_name)
            else:
                # 无法识别的文件类型
                print('无法识别的文件类型')
                return

    # 选择目标 按钮 单击事件
    def click_selectTargetFile(self):
        global targetFilePath
        file_name = QFileDialog.getOpenFileName(self.ui, "选择目标文件", "../Data",
                                                    'Excel files (*.xls *.xlsx);; All files (*)')  # 选择文件,返回选中的文件路径
        print(file_name)

        if file_name:
            file_name = file_name[0]
            self.file_name = file_name
            # 根据文件类型读取数据
            if file_name.endswith('.xls') or file_name.endswith('.xlsx'):
                targetFilePath = file_name
                # 显示文件名称
                self.ui.lineEdit_targetPath.setText(file_name)
            else:
                # 无法识别的文件类型
                print('无法识别的文件类型')
                return

    #  运行 按钮 单击事件
    def click_runCopy(self):
        t_write = threading.Thread(target=write_row_by_second, )
        t_write.setDaemon(True)
        t_write.start()

    # 更新日志
    def update_log(self, msg):
        self.ui.textEdit_log.append(msg)

    def scroll_to_bottom(self):
        # 获取垂直滚动条
        scrollbar = self.ui.textEdit_log.verticalScrollBar()
        # 设置滚动条到最下面
        scrollbar.setValue(scrollbar.maximum())

def write_row_by_second():
    global sourceFilePath,  targetFilePath
    # 获取源文件的总行数
    source_workbook = openpyxl.load_workbook(sourceFilePath)
    source_sheet = source_workbook.active  # 假设源文件只有一个工作表
    total_rows = source_sheet.max_row
    # 初始化计数器
    row_to_copy = 1
    print(f"total_rows={total_rows}")
    while row_to_copy <= total_rows:
        # 打开目标文件
        target_workbook = openpyxl.load_workbook(targetFilePath)
        target_sheet = target_workbook.active  # 假设目标文件只有一个工作表

        # 复制数据,每次复制一行,,所有列
        for col in range(1, source_sheet.max_column + 1):
            cell_value = source_sheet.cell(row=row_to_copy, column=col).value
            target_sheet.cell(row=row_to_copy, column=col, value=cell_value)

        # 保存目标文件
        target_workbook.save(targetFilePath)
        target_workbook.close()

        # 打印信息
        print(f"Copied data from row {row_to_copy}: {source_sheet[row_to_copy]}")
        msg = f"Copied data from row {row_to_copy}\n"
        window.update_log(msg=msg)
        # 增加行计数
        row_to_copy += 1

        if row_to_copy <= total_rows:
            # 1秒复制一行
            time.sleep(1)

    # 关闭源文件的工作簿
    source_workbook.close()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyWindow()
    window.ui.show()
    sys.exit(app.exec_())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1386022.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

盛元广通实验动物中心饲养管理系统2.0

盛元广通实验动物中心饲养管理系统2.0主要功能包括&#xff1a;访客登记、笼位/架管理、笼位预约、动物订购、伦理审查、谱系管理、饲养繁育管理、动物房消毒管理、费用管理、垫料管理等功能。实验室动物中心饲养管理系统是一个综合性的管理平台&#xff0c;主要用于实验动物的…

MySQL 删除ibdata1时怎么恢复

标题&#xff1a;MySQL InnoDB数据恢复&#xff0c;丢失ibdata1时怎么安全恢复 废话在前&#xff1a; 恭喜你&#xff0c;当你看到这篇文章的时候&#xff0c;说明有可能 你心里已经有一万匹&#x1f40e;在奔腾了。千万不要乱删除ibdata1&#xff0c;有些博客无脑抓取、复制…

项目经理如何提高自己和团队的效率?

技术人员和管理人员&#xff0c;两者是不同的。当有一天领导将你从一线技术人员被提拔为项目经理&#xff0c;也许这是你一直期盼的&#xff0c;也许这使你忐忑不安&#xff0c;也许这是你职业发展的转折&#xff0c;而你当时可能只是不情愿地答应老板“试一下”。 不管哪种情…

AWS边缘媒体安全交付方案

企业如何在AWS上的边缘站点&#xff0c;安全的将优质视频内容交付给用户&#xff0c;并且禁止哪些未经过授权的访问&#xff1f;九河云将基于AWS平台提供边缘媒体安全交付解决方案 解决方案详情 在通过 Amazon CloudFront 交付时&#xff0c;免受未经授权的访问。基于添加到交…

构建基于RHEL9系列(CentOS9,AlmaLinux9,RockyLinux9等)的支持63个常见模块的PHP8.1.20的RPM包

本文适用&#xff1a;rhel9系列&#xff0c;或同类系统(CentOS9,AlmaLinux9,RockyLinux9等) 文档形成时期&#xff1a;2023年 因系统版本不同&#xff0c;构建部署应略有差异&#xff0c;但本文未做细分&#xff0c;对稍有经验者应不存在明显障碍。 因软件世界之复杂和个人能力…

信息之板:数据看板如何点亮我们的生活

数据看板&#xff0c;作为数据可视化的一种应用形式&#xff0c;已经逐渐渗透到我们的日常生活中&#xff0c;发挥着越来越重要的作用。这种集中呈现和分析信息的工具&#xff0c;不仅在企业管理中大放异彩&#xff0c;更在我们的日常生活中展现出了强大的价值。下面我就以可视…

力扣精选算法100题——水果成篮(滑动窗口专题)

本题链接&#x1f449;水果成篮 第一步&#xff1a;了解题意 我就按照实例1来进行对这题的理解。 1代表种类类型&#xff0c;这个数组里面有2个种类类型 ps:种类1和种类2 &#xff0c;只不过种类1是有2个水果&#xff0c;种类2有一个水果&#xff0c;共计3个水果。 本题需要解…

Transformer原理与代码实现

Transformer原理与代码实现 概览 一、嵌入层 Embedding 二、位置编码 Positional Encoding 三、&#xff08;整合&#xff09;Transformer嵌入层 Transformer Embedding 四、带缩放的点积注意力机制 Scaled Dot-Product Attention 五、多头注意力 Multi-Head Attention 六…

simulink之Data Type Conversion

Data Type Conversion 将输入信号转换为指定的数据类型。 数据类型转换块将任何Simulink数据类型的输入信号转换为您为输出数据类型参数指定的数据类型。输入可以是任何实值或复值信号。如果输入是真实的&#xff0c;那么输出就是真实的。如果输入是复杂的&#xff0c;那么输出…

日处理100立方污水的污水成套设备需要哪些

对于处理100立方污水的污水成套设备&#xff0c;我们可以选择以下几种设备来完成任务。首先&#xff0c;我们需要一个污水处理设备&#xff0c;它可以帮助我们去除污水中的固体悬浮物和污染物。这个设备可以将污水中的固体物质过滤掉&#xff0c;使水变得清澈透明。同时&#x…

SQL语句错误this is incompatible with sql_mode=only_full_group_by解决方法

一、原理层面 这个错误发生在mysql 5.7.5 版本及以上版本会出现的问题&#xff1a; mysql 5.7.5版本以上默认的sql配置是:sql_mode“ONLY_FULL_GROUP_BY”&#xff0c;这个配置严格执行了"SQL92标准"。 很多从5.6升级到5.7时&#xff0c;为了语法兼容&#xff0c;大部…

如何做用户分层和标签体系

“活动作了一场接一场&#xff0c;简直要累死了&#xff0c;拉进来的客户也没有多少&#xff0c;投入产出完全不成比例&#xff0c;怎么办&#xff1f;“ “有那么多注册用户&#xff0c;但是GMV怎么才这么点&#xff0c;他们怎么不买啊&#xff0c;难道都是羊毛党&#xff1f;…

CompletableFuture原理与用法

CompletableFuture 是由Java8引入的&#xff0c;这让我们编写清晰可读的异步代码变得更加容易&#xff0c;该类功能比Future 更加强大。 什么是 CompletableFuture 在Java中CompletableFuture用于异步编程&#xff0c;异步通常意味着非阻塞&#xff0c;运行任务单独的线程&…

muduo网络库剖析——套接字Socket类

muduo网络库剖析——套接字Socket类 前情从muduo到my_muduo 概要socket网络编程socket编程接口介绍头文件socketbindlistenacceptaccept4connect 框架与细节成员函数使用方法 源码结尾 前情 从muduo到my_muduo 作为一个宏大的、功能健全的muduo库&#xff0c;考虑的肯定是众多…

BPF 程序与信号交互大揭秘

本文地址 &#xff1a; BPF 程序与信号交互大揭秘 | 深入浅出 eBPF 原文&#xff1a;Signaling from within: how eBPF interacts with signals 1. 背景2. 动机3. 场景&#xff1a;拦截 openat(2)4. 内核如何处理 SIGKILL 信号&#xff1f;5. 什么信号要后置处理6. 通过 BPF程…

arcgis javascript api4.x以basetilelayer方式加载arcgis发布的栅格切片服务

需求&#xff1a; 以arcgis js api的basetilelayer加载arcgis发布的栅格切片服务 效果图&#xff1a; 其中和tileinfo和lods&#xff0c;这样获取&#xff1a; https://map.geoq.cn/arcgis/rest/services/ChinaOnlineCommunity/MapServer/?fpjson urltemplate&#xff1a; …

Pod的控制器

Pod的控制器是什么&#xff1f; pod控制器&#xff1a;工作负载均衡。workload。用于管理pod的中间层。确保pod资源符合预期的状态。 预期状态&#xff1a; 副本数 容器的重启策略 镜像拉取策略 pod出现故障时的重启等等 Pod控制器的类型 1、 replicaSet&#xff1a;指…

RC4(CTFshow re2)

基本原理 RC4属于对称密码算法中的流密码加密算法 什么是对称密码&#xff1f; 使用同一个密钥进行加密和解密 什么是流密码&#xff1f; 一个字节一个字节的进行加密/解密 RC4密钥长度是可以变的&#xff0c;面向字节操作 它以一个足够大的表s为基础 对表进行非线性变换&…

Web3去中心化存储:重新定义云服务

随着Web3技术的崭露头角&#xff0c;去中心化存储正在成为数字时代云服务的全新范式。传统的云服务依赖于中心化的数据存储架构&#xff0c;而Web3的去中心化存储则为用户带来了更安全、更隐私、更可靠的数据管理方式&#xff0c;重新定义了云服务的未来。 1.摒弃中心化的弊端 …

酒类销售新模式:用户裂变,利润倍增的秘诀

在当今竞争激烈的市场环境中&#xff0c;如何设计出既吸引用户又能带来高利润的商业模式&#xff0c;成为了企业成功的关键。酒类销售也不例外。最近&#xff0c;一种创新的酒类销售模式在市场上悄然兴起&#xff0c;它不仅让消费者在购买中获得实实在在的优惠&#xff0c;还通…