八、Python结合Qt实现点击按钮保存并生成自定义word详细讲解(相信我,耐心看完,一定会有收获的)

news2024/11/15 8:21:11

一、需求介绍

因为我的毕设需要设计一个系统,然后把结果生成检测报告供企业下载。模型大概已经训练好了,也就差个导出word功能,把模型识别的数据结果输入到word导出即可。

二、最终实现效果

这里随便整个模板来对所需要的函数进行说明,单行、双行、标题、图片基本上所需要的需求都有了,进行了开始进行详细的讲解
在这里插入图片描述

三、分析

1,标题:陕西省功能面料重点实验室

在这里插入图片描述

2,段落(正文):织物起球等级检测报告

在这里插入图片描述

3,表格:31行18列

将俩表格一对比家人们应该就差不多明白了吧,将对角的单元格合并即可
一共分为六个块
在这里插入图片描述

在这里插入图片描述

四、实战

ⅠQt界面

就先简单设计一个页面,点击button然后生成word
页面文件名称为:word_test.ui
button的名称为:pushButton
在这里插入图片描述

ⅡPython代码

1,准备工作

创建一个python文件,例如:_test.py,这个文件待会要进行代码编写
将ui文件与py文件放到同一个路径下
我的是这样
在这里插入图片描述
然后我这边添加一个logo图片,三张测试样本图片
最终的目录结构如图所示:在这里插入图片描述

2,我使用的是PyCharm,当然其他的IDE都可以

选择一个环境空间,看个人需求,这个环境空间得有相应的包
在这里插入图片描述

3,导包

缺啥包直接pip install安装,这里就不再赘述

from PySide2.QtWidgets import QApplication
from PySide2.QtUiTools import QUiLoader
from PySide2.QtGui import QIcon
from docx import Document
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.shared import Inches,Cm,Pt

4,主函数以及控件绑定

详细pyqt可参考博文:二、页面布局
主函数

if __name__=="__main__":
    app = QApplication([])
    app.setWindowIcon(QIcon('./yyy.png')) #logo图片位置
    gui = test_word()  #初始化
    gui.window_init()
    gui.ui.show() #将窗口控件显示在屏幕上
    app.exit(app.exec_())

控件绑定
self.ui.pushButton.clicked.connect(self.word),当控件被点击的时候,调用word函数即可,主要难点在于word函数的逻辑编写

class test_word():

    def __init__(self):
        # 从文件中加载UI定义
        # 从 UI 定义中动态 创建一个相应的窗口对象
        # 注意:里面的控件对象也成为窗口对象的属性了
        # 比如 self.ui.button , self.ui.textEdit
        self.ui = QUiLoader().load('word_test.ui')  # 这里的参数为ui的路径,对这个ui文件创建对象ui
        """
        对某个控件进行操作会产生一个signal,常通过slot来进行处理signal
        slot就是通过clicked.connect来绑定某个函数,这个函数用于处理signal
        """
        self.output_size = 320

    def window_init(self):
        self.ui.pushButton.clicked.connect(self.word)

5,word函数功能实现详细讲解

①初始化参数

为了简便问题,这里使用字符串代替word里面的内容

print("正在生成word检测报告...") # 方便调试使用
name = "yanyu"
product_name = "新型隐身作战服"
testing_department = "西安工程大学"
test_category = "棉织物"
production_unit = "咸阳际华新三零"
number_of_samples = "1张"
sample_price = "512.32 $"
test_instrument = "万能耐磨仪"
sample_grade = "3级"

②添加标题

document = Document(),首先定义一个文档对象
document.styles['Normal'].font.name = u'宋体',设置字体为宋体
document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体'),汉字是宋体,字母是eastAsia
title = document.add_heading(u'陕西省功能面料重点实验室', 0),创建标题,这里的参数0是标题,其他的数字分别表示对应的标题等级
在这里插入图片描述
title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER,标题居中

添加标题完整代码
document = Document()
document.styles['Normal'].font.name = u'宋体'
document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')

#添加标题
title = document.add_heading(u'陕西省功能面料重点实验室', 0)#0级标题
# 标题居中
title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER

④添加段落

p = document.add_paragraph(),定义一个段落对象
p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER,段落居中
r = p.add_run('织物起球等级检测报告'),显示内容
r.font.size = Pt(24),字体大小设置
需要添加几个段落就加几个就行,这里以俩段落为例

添加段落完整代码
#添加段落1
p = document.add_paragraph()
p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER #添加的段落都居中
r = p.add_run('织物起球等级检测报告')
r.font.size = Pt(24)
r.bold = True

# 添加段落2
p1 = document.add_paragraph()
p1.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER  # 添加的段落都居中
r1 = p1.add_run('author:yanyu')
r1.font.size = Pt(12)
r1.bold = True

在这里插入图片描述

⑤添加表格

根据我上面分析的,然后进行合并即可
之后添加内容
table = document.add_table(rows=31, cols=18, style='Table Grid'),创建31行28列的表格
table.autofit = False,不需要根据内容来自适应
table.columns[0].width = Inches(0.49),列宽0.49英寸

由上述分析可得,表格可分为六个块组成,接下来一块一块的来进行讲解

第一块:
在这里插入图片描述
table.cell(0, 0).merge(table.cell(2, 2)),将(0,0)(2,2)单元合并
table.cell(0, 3).merge(table.cell(2, 17)),同理,将(0,3)(2,17)单元合并
block_1 = table.rows[0].cells,获得第一块对象。整个表格一共分为六块,第一块是从第0行开始的,故通过table.rows[0].cells来进行获取
block_1[0].add_paragraph('产品名称\n').alignment = WD_ALIGN_PARAGRAPH.CENTER,第一块对象是block_1,需要在第0列出添加内容
block_1[3].add_paragraph(product_name).alignment = WD_ALIGN_PARAGRAPH.CENTER,在第3列添加内容
在这里插入图片描述

第二块:
在这里插入图片描述
table.cell(3, 0).merge(table.cell(5, 2)),将(3,0)(5,2)单元合并
table.cell(3, 3).merge(table.cell(5, 8)),将(3,3)(5,8)单元合并
table.cell(3, 9).merge(table.cell(5, 11)),将(3,9)(5,11)单元合并
table.cell(3, 12).merge(table.cell(5, 17)),将(3,12)(5,17)单元合并
block_2 = table.rows[3].cells,获得第二块对象。第二块是从第3行开始的,故通过table.rows[3].cells来进行获取
block_2[0].add_paragraph('测试部门\n').alignment = WD_ALIGN_PARAGRAPH.CENTER,第二块对象是block_2,需要在第0列出添加内容
block_2[3].add_paragraph(testing_department).alignment = WD_ALIGN_PARAGRAPH.CENTER,在第3列出添加内容
block_2[9].add_paragraph('检验类别\n').alignment = WD_ALIGN_PARAGRAPH.CENTER,在第9列出添加内容
block_2[12].add_paragraph(test_category).alignment = WD_ALIGN_PARAGRAPH.CENTER,在第12列出添加内容
在这里插入图片描述

第三块:
在这里插入图片描述
table.cell(6, 0).merge(table.cell(8, 2)),将(6,0)(8,2)单元合并
table.cell(6, 3).merge(table.cell(8, 8)),将(6,3)(8,8)单元合并
table.cell(6, 9).merge(table.cell(8, 11)),将(6,9)(8,11)单元合并
table.cell(6, 12).merge(table.cell(8, 17)),将(6,12)(8,17)单元合并
block_3 = table.rows[6].cells,获得第三块对象。第三块是从第6行开始的,故通过table.rows[6].cells来进行获取
block_3[0].add_paragraph('生产单位\n').alignment = WD_ALIGN_PARAGRAPH.CENTER,第三块对象是block_3,需要在第0列出添加内容
block_3[3].add_paragraph(production_unit).alignment = WD_ALIGN_PARAGRAPH.CENTER,在第3列出添加内容
block_3[9].add_paragraph('样品数量\n').alignment = WD_ALIGN_PARAGRAPH.CENTER,在第9列出添加内容
block_3[12].add_paragraph(number_of_samples).alignment = WD_ALIGN_PARAGRAPH.CENTER,在第12列出添加内容
在这里插入图片描述

第四块:
在这里插入图片描述

table.cell(9, 0).merge(table.cell(11, 2)),将(9,0)(11,2)单元合并
table.cell(9, 3).merge(table.cell(11, 8)),将(9,3)(11,8)单元合并
table.cell(9, 8).merge(table.cell(11, 11)),将(9,8)(11,11)单元合并
table.cell(9, 12).merge(table.cell(11, 17)),将(9,12)(11,17)单元合并
block_4 = table.rows[9].cells,获得第四块对象,第四块是从第9行开始的,故通过table.rows[9].cells来进行获取
block_4[0].add_paragraph('测试仪器\n').alignment = WD_ALIGN_PARAGRAPH.CENTER,第四大行对象是block_4,需要在第0列出添加内容
block_4[3].add_paragraph(test_instrument).alignment = WD_ALIGN_PARAGRAPH.CENTER,第四块的对象是block_4,需要在第3列出添加内容
block_4[9].add_paragraph('样品价格\n').alignment = WD_ALIGN_PARAGRAPH.CENTER,第四块对象的是block_4,需要在第9列出添加内容
block_4[12].add_paragraph(sample_price).alignment = WD_ALIGN_PARAGRAPH.CENTER,第四块的对象是block_4,需要在第12列出添加内容
在这里插入图片描述

第五块:
在这里插入图片描述
table.cell(12, 0).merge(table.cell(14, 2)),将(12,0)(14,2)单元合并
table.cell(12, 3).merge(table.cell(14, 17)),将(12,3)(14,17)单元合并
block_5 = table.rows[12].cells,获得第五块对象,第五块是从第12行开始的,故通过table.rows[12].cells来进行获取
block_5[0].add_paragraph('最终评定等级结果\n').alignment = WD_ALIGN_PARAGRAPH.CENTER,第五块对象是block_5,需要在第0列出添加内容
block_5[3].add_paragraph(sample_grade).alignment = WD_ALIGN_PARAGRAPH.CENTER,第五块的对象是block_5,需要在第3列出添加内容

第六块
在这里插入图片描述
左边部分
table.cell(15, 0).merge(table.cell(30, 2)),将(15,0)(30,2)单元合并
table.cell(15, 3).merge(table.cell(20, 7)),将(15,3)(20,7)单元合并
table.cell(15, 8).merge(table.cell(20, 12)),将(15,8)(20,12)单元合并
table.cell(15, 13).merge(table.cell(20, 17)),将(15,13)(20,17)单元合并
table.cell(21, 3).merge(table.cell(21, 7)),将(21,3)(21,7)单元合并
table.cell(21, 8).merge(table.cell(21, 12)),将(21,8)(21,12)单元合并
table.cell(21, 13).merge(table.cell(21, 17)),将(21,13)(21,17)单元合并
table.cell(22, 3).merge(table.cell(30, 17)),将(22,3)(30,17)单元合并
block_6 = table.rows[15].cells,获得第六块对象,第六块是从第15行开始的,故通过table.rows[15].cells来进行获取
block_6[0].add_paragraph('测试结果\n').alignment = WD_ALIGN_PARAGRAPH.CENTER,第六块对象是block_6,需要在第0列出添加内容
在这里插入图片描述

接着添加图片
picture_origin = table.cell(15, 3).paragraphs[0].add_run(),在(15,3)出添加一个文本块
origin = picture_origin.add_picture("./1.jpg"),加入图片
origin.height = Cm(3.83),设置图片高度
origin.width = Cm(3.83),设置图片宽度

picture_predict = table.cell(15, 8).paragraphs[0].add_run(),在(15,8)出添加一个文本块
predict = picture_predict.add_picture("./2.jpg"),加入图片
predict.height = Cm(3.83),设置图片高度
predict.width = Cm(3.83),设置图片宽度

picture_statistics = table.cell(15, 13).paragraphs[0].add_run(),在(15,13)出添加一个文本块
statistics = picture_statistics.add_picture("./3.jpg"),加入图片
statistics.height = Cm(3.83),设置图片高度
statistics.width = Cm(3.83),设置图片宽度
在这里插入图片描述
两行字
block_6_1 = table.rows[21].cells
block_6_1[3].add_paragraph('origin').alignment = WD_ALIGN_PARAGRAPH.CENTER
block_6_1[8].add_paragraph('predict').alignment = WD_ALIGN_PARAGRAPH.CENTER
block_6_1[13].add_paragraph('statistics').alignment = WD_ALIGN_PARAGRAPH.CENTER
在这里插入图片描述
最后一个文本框
block_6_2 = table.rows[22].cells
block_6_2[3].add_paragraph('制作不易,点个赞呗').alignment = WD_ALIGN_PARAGRAPH.CENTER
block_6_2[3].add_paragraph('制作不易,点个赞呗').alignment = WD_ALIGN_PARAGRAPH.CENTER
block_6_2[3].add_paragraph('制作不易,点个赞呗').alignment = WD_ALIGN_PARAGRAPH.CENTER
在这里插入图片描述
最终结果
在这里插入图片描述

添加表格完整代码
#添加表格
table = document.add_table(rows=32, cols=16, style='Table Grid')
table.autofit = False
table.columns[0].width = Inches(0.49)

table.cell(0, 0).merge(table.cell(2, 2))
table.cell(0, 3).merge(table.cell(2, 15))
row_0 = table.rows[0].cells
row_0[0].add_paragraph('产品名称\n').alignment = WD_ALIGN_PARAGRAPH.CENTER


table.cell(3, 0).merge(table.cell(5, 2))
table.cell(3, 3).merge(table.cell(5, 7))
table.cell(3, 8).merge(table.cell(5, 10))
table.cell(3, 11).merge(table.cell(5, 15))
row_1 = table.rows[3].cells
row_1[0].add_paragraph('测试部门\n').alignment = WD_ALIGN_PARAGRAPH.CENTER
row_1[8].add_paragraph('检验类别\n').alignment = WD_ALIGN_PARAGRAPH.CENTER

table.cell(6, 0).merge(table.cell(8, 2))
table.cell(6, 3).merge(table.cell(8, 7))
table.cell(6, 8).merge(table.cell(8, 10))
table.cell(6, 11).merge(table.cell(8, 15))
row_2 = table.rows[6].cells
row_2[0].add_paragraph('生产单位\n').alignment = WD_ALIGN_PARAGRAPH.CENTER
row_2[8].add_paragraph('样品数量\n').alignment = WD_ALIGN_PARAGRAPH.CENTER

table.cell(9, 0).merge(table.cell(11, 2))
table.cell(9, 3).merge(table.cell(11, 7))
table.cell(9, 8).merge(table.cell(11, 10))
table.cell(9, 11).merge(table.cell(11, 15))
row_3 = table.rows[9].cells
row_3[0].add_paragraph('测试仪器\n').alignment = WD_ALIGN_PARAGRAPH.CENTER
row_3[8].add_paragraph('样品等级\n').alignment = WD_ALIGN_PARAGRAPH.CENTER


table.cell(12, 0).merge(table.cell(31, 2))
table.cell(12, 3).merge(table.cell(31, 15))
row_4 = table.rows[12].cells
row_4[0].add_paragraph('测试结果\n').alignment = WD_ALIGN_PARAGRAPH.CENTER

在这里插入图片描述

五、完整代码

from PySide2.QtWidgets import QApplication
from PySide2.QtUiTools import QUiLoader
from PySide2.QtGui import QIcon
from docx import Document
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.shared import Inches,Cm,Pt

class test_word():

    def __init__(self):
        # 从文件中加载UI定义
        # 从 UI 定义中动态 创建一个相应的窗口对象
        # 注意:里面的控件对象也成为窗口对象的属性了
        # 比如 self.ui.button , self.ui.textEdit
        self.ui = QUiLoader().load('word_test.ui')  # 这里的参数为ui的路径,对这个ui文件创建对象ui
        """
        对某个控件进行操作会产生一个signal,常通过slot来进行处理signal
        slot就是通过clicked.connect来绑定某个函数,这个函数用于处理signal
        """
        self.output_size = 320

    def window_init(self):
        self.ui.pushButton.clicked.connect(self.word)


    def word(self):
        print("正在生成word检测报告...")
        name = "yanyu"
        product_name = "新型隐身作战服"
        testing_department = "西安工程大学"
        test_category = "棉织物"
        production_unit = "咸阳际华新三零"
        number_of_samples = "1张"
        sample_price = "512.32 $"
        test_instrument = "万能耐磨仪"
        sample_grade = "3级"

        document = Document()
        document.styles['Normal'].font.name = u'宋体'
        document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')

        #添加标题
        title = document.add_heading(u'陕西省功能面料重点实验室', 0) #0级标题
        # 标题居中
        title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER

        #添加段落1
        p = document.add_paragraph()
        p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER #添加的段落都居中
        r = p.add_run('织物起球等级检测报告')
        r.font.size = Pt(24)
        r.bold = True

        # 添加段落2
        p1 = document.add_paragraph()
        p1.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER  # 添加的段落都居中
        r1 = p1.add_run('author:yanyu')
        r1.font.size = Pt(12)
        r1.bold = True


        #添加表格
        table = document.add_table(rows=31, cols=18, style='Table Grid')
        table.autofit = False
        table.columns[0].width = Inches(0.49)

        # 第一块
        table.cell(0, 0).merge(table.cell(2, 2))
        table.cell(0, 3).merge(table.cell(2, 17))
        block_1 = table.rows[0].cells
        block_1[0].add_paragraph('产品名称\n').alignment = WD_ALIGN_PARAGRAPH.CENTER
        block_1[3].add_paragraph(product_name).alignment = WD_ALIGN_PARAGRAPH.CENTER

        # 第二块
        table.cell(3, 0).merge(table.cell(5, 2))
        table.cell(3, 3).merge(table.cell(5, 8))
        table.cell(3, 9).merge(table.cell(5, 11))
        table.cell(3, 12).merge(table.cell(5, 17))
        block_2 = table.rows[3].cells
        block_2[0].add_paragraph('测试部门\n').alignment = WD_ALIGN_PARAGRAPH.CENTER
        block_2[3].add_paragraph(testing_department).alignment = WD_ALIGN_PARAGRAPH.CENTER
        block_2[9].add_paragraph('检验类别\n').alignment = WD_ALIGN_PARAGRAPH.CENTER
        block_2[12].add_paragraph(test_category).alignment = WD_ALIGN_PARAGRAPH.CENTER

        # 第三块
        table.cell(6, 0).merge(table.cell(8, 2))
        table.cell(6, 3).merge(table.cell(8, 8))
        table.cell(6, 9).merge(table.cell(8, 11))
        table.cell(6, 12).merge(table.cell(8, 17))
        block_3 = table.rows[6].cells
        block_3[0].add_paragraph('生产单位\n').alignment = WD_ALIGN_PARAGRAPH.CENTER
        block_3[3].add_paragraph(production_unit).alignment = WD_ALIGN_PARAGRAPH.CENTER
        block_3[9].add_paragraph('样品数量\n').alignment = WD_ALIGN_PARAGRAPH.CENTER
        block_3[12].add_paragraph(number_of_samples).alignment = WD_ALIGN_PARAGRAPH.CENTER

        # 第四块
        table.cell(9, 0).merge(table.cell(11, 2))
        table.cell(9, 3).merge(table.cell(11, 8))
        table.cell(9, 9).merge(table.cell(11, 11))
        table.cell(9, 12).merge(table.cell(11, 17))
        block_4 = table.rows[9].cells
        block_4[0].add_paragraph('测试仪器\n').alignment = WD_ALIGN_PARAGRAPH.CENTER
        block_4[3].add_paragraph(test_instrument).alignment = WD_ALIGN_PARAGRAPH.CENTER
        block_4[9].add_paragraph('样品价格\n').alignment = WD_ALIGN_PARAGRAPH.CENTER
        block_4[12].add_paragraph(sample_price).alignment = WD_ALIGN_PARAGRAPH.CENTER

        # 第五块
        table.cell(12, 0).merge(table.cell(14, 2))
        table.cell(12, 3).merge(table.cell(14, 17))
        block_5 = table.rows[12].cells
        block_5[0].add_paragraph('最终评定等级结果\n').alignment = WD_ALIGN_PARAGRAPH.CENTER
        block_5[3].add_paragraph(sample_grade).alignment = WD_ALIGN_PARAGRAPH.CENTER

        # 第六块
        table.cell(15, 0).merge(table.cell(30, 2))

        table.cell(15, 3).merge(table.cell(20, 7))
        table.cell(15, 8).merge(table.cell(20, 12))
        table.cell(15, 13).merge(table.cell(20, 17))

        table.cell(21, 3).merge(table.cell(21, 7))
        table.cell(21, 8).merge(table.cell(21, 12))
        table.cell(21, 13).merge(table.cell(21, 17))

        table.cell(22, 3).merge(table.cell(30, 17))

        block_6 = table.rows[15].cells
        block_6[0].add_paragraph('测试结果\n').alignment = WD_ALIGN_PARAGRAPH.CENTER

        picture_origin = table.cell(15, 3).paragraphs[0].add_run()
        origin = picture_origin.add_picture("./1.jpg")
        origin.height = Cm(3.83)
        origin.width = Cm(3.83)

        picture_predict = table.cell(15, 8).paragraphs[0].add_run()
        predict = picture_predict.add_picture("./2.jpg")
        predict.height = Cm(3.83)
        predict.width = Cm(3.83)

        picture_statistics = table.cell(15, 13).paragraphs[0].add_run()
        statistics = picture_statistics.add_picture("./3.jpg")
        statistics.height = Cm(3.83)
        statistics.width = Cm(3.83)

        block_6_1 = table.rows[21].cells
        block_6_1[3].add_paragraph('origin').alignment = WD_ALIGN_PARAGRAPH.CENTER
        block_6_1[8].add_paragraph('predict').alignment = WD_ALIGN_PARAGRAPH.CENTER
        block_6_1[13].add_paragraph('statistics').alignment = WD_ALIGN_PARAGRAPH.CENTER

        block_6_2 = table.rows[22].cells
        block_6_2[3].add_paragraph('制作不易,点个赞呗').alignment = WD_ALIGN_PARAGRAPH.CENTER
        block_6_2[3].add_paragraph('制作不易,点个赞呗').alignment = WD_ALIGN_PARAGRAPH.CENTER
        block_6_2[3].add_paragraph('制作不易,点个赞呗').alignment = WD_ALIGN_PARAGRAPH.CENTER


        document.save(name+'finish.docx')
        print("检测报告生成完毕")

if __name__=="__main__":
    app = QApplication([])
    app.setWindowIcon(QIcon('./yyy.png')) #logo图片位置
    gui = test_word()  #初始化
    gui.window_init()
    gui.ui.show() #将窗口控件显示在屏幕上
    app.exit(app.exec_())

最终效果如下:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

Linux常用命令——iperf命令

在线Linux命令查询工具 iperf 网络性能测试工具 补充说明 iperf命令是一个网络性能测试工具。iperf可以测试TCP和UDP带宽质量。iperf可以测量最大TCP带宽,具有多种参数和UDP特性。iperf可以报告带宽,延迟抖动和数据包丢失。利用iperf这一特性&#x…

怎样搭建游戏服务器,传奇复古版手游是怎样搭建的,用云服务器架设游戏技术详细教程

本教程以战神传奇复古修复装备版为例: 本教程资源提供:海盗空间 --------------------------------------------------------------------------------------------------- 系统:Windows Server 2012 R2 x64 -----------------------------…

Python - 优先队列(queue.PriorityQueue heapq)

目录 什么是优先队列 为什么需要优先队列? 优先队列是个啥? 优先队列的工作原理 Python实现一个优先队列 Python内置库中的queue.PriorityQueue的使用 基本操作 多条件优先级实现 Python内置库中的heapq heapq的常用操作 基于heapq实现一个优…

通过AI生成的视频分发了难以检测的恶意软件加载程序

安全研究人员警告说,一种新的恶意软件加载程序被用作 Aurora 信息窃取程序感染链的一部分。 加载程序使用反虚拟机 (VM) 和不寻常的编译技术,这些技术似乎使其非常成功地避免了安全解决方案的检测。 Aurora 信息窃取器是用 Go 编写的,作为恶…

高速下载Arxiv论文的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【微服务笔记19】微服务组件之Nacos注册中心基础环境搭建

这篇文章,主要介绍微服务组件之Nacos注册中心基础环境搭建。 目录 一、Nacos注册中心 1.1、Nacos注册中心 1.2、搭建NacosServer服务端 (1)下载Nacos Server服务端工程 (2)修改配置信息 (3&#xff0…

【Hello Network】网络编程套接字(三)

作者:小萌新 专栏:网络 作者简介:大二学生 希望能和大家一起进步 本篇博客简介:简单介绍下各种类型的Tcp协议 各种类型Tcp服务器 多进程版的TCP网络程序捕捉SIGCHLD信号让孙子进程执行任务 多线程TCP网络程序线程池版多线程TCP网络…

Elasticsearch学习,请先看这篇!

目录 一、初始elasticsearch 1、概述 简介 发展 2、倒排索引 3、基本概念 文档 索引 Mysql和es的区别 4、分词器 初始分词器 Ik分词器-扩展词库 二、索引库操作 1、mapper属性 2、创建索引库 3、查询、删除索引库 三、文档操作 1、新增文档 2、查询、删除文档…

计算机网络科普

文章目录 1、集线器2、CSMA/CD协议3、交换机3.1 交换机的桥接 4、 路由器5、 路由表6、IP地址7、MAC地址8、ARP协议9、关于网络层次模型10、路由器 1、集线器 计算机之间的相互通信,你会怎么设计? 如果是两台计算机,之间拉一条线,…

ClickHouse性能优化

目录 1 Explain查看执行计划优化sql1.1 基本语法1.2 案例实操1.2.1 查看 PLAIN1.2.2 AST 语法树1.2.3 SYNTAX 语法优化1.2.4 查看 PIPELINE 2 ClickHouse建表优化2.1 数据类型2.1.1 时间字段的类型2.1.2 空值存储类型 2.2 分区和索引2.3 表参数2.4 写入和删除优化2.5 常见配置2…

分享一些提升效率的小工具

1、 IObit Uninstaller IObit Uninstaller是一款简单专业的卸载工具,可以帮我们卸载电脑中顽固难卸的软件和浏览器插件,支持强制一键卸载和文件粉碎功能。 除了卸载软件,它还可以自动帮我们检测软件安装、检测软件更新、查看工具栏和插件。 …

IDEA22.3.3的三个常用经常遇到的配置问题

1、期待效果:【打开iDEA的时候,让开发者选择需要打开的项目】 设置如下 2、期待效果:配置默认的Maven,避免每次新建项目后,都需要去修改Maven配置 同理,修改默认的java版本和自己本地java环境一致 3、新建…

数据库SQL语句优化技巧

当今世界,数据量不断增长,数据库的使用变得越来越普遍。虽然数据库提供了很多强大的功能,但是它们也需要被优化以确保它们的性能得到最大化。在本篇博客中,我们将探讨SQL语句优化的几种技巧,这些技巧可以帮助您提高数据…

零、网络基础概述(TCP/IP模型、端口、网关、DNS、ARP、IP编址与子网划分、UDP、VRP)

文章目录 前言一、网络基础1、TCP/IP模型2、端口的作用:3、MAC 地址4、网关(gateway)5、域名解析服务(DNS)6、TCP端口、UDP端口区别:7、交换机与路由器 二、ARP 理论1、定义2、查看ARP缓存3、ARP 报文种类&…

Linux基础——远程访问及控制(SSH)

Linux基础——远程访问及控制 一、OpenSSH服务器二、sshd_config配置文件三、SSH服务端1.查询版本—— ssh -V2.SSH远程登录3.监听端口修改4.设置黑白名单5.远程复制——scp6.安全性传输——sftp 四、SSH服务的验证1.SSH服务的两种验证方式密码验证密钥验证 3.公钥与私钥的关系…

ORA-04021:等待锁定对象时发生超时

现场人员反馈问题,drop表报错,如下图 是个rac环境,处理过程 1、2个节点上查看锁表,没任何输出 SYSorcl2> select name from v$db_object_cache where ownerUSR_DATAI and type in(PROCEDURE,FUNCTION) and locks > 0 and …

软件版本号

版本号 上图是在MVN仓库中随便找的一个依赖的历 史版本 我们可以发现版本号一般是由 数字英文 组成 数字 一般大家都会看到1.x或者1.xx.xxx.Beta这种版本号,前面是数字 以 1.xx.xxx 为例 1是major号,一般重大更新会更新major号.xx或者.xx.xxx称为min…

arduino学习笔记1

一.hello word实验 1.基础结构 void setup() {// put your setup code here, to run once://设置初始状态,比如引脚、波特率等 }void loop() {// put your main code here, to run repeatedly://相当于main函数,但一直循环 }2.Serial(串行通…

像素是什么

像素分为设备像素和设备无关像素。 下面说说来龙去脉。 一、显示器 显示图像的电子设备。 (一)显示器种类 1.LCD LCD(Liquid crystal display),是液体晶体显示,也就是液晶显示器,LCD具有功耗低…

谷歌 Google Cloud 安装 NodeJS服务环境

目录 1. 安装 wget2. 安装 Node2.1 下载安装包2.2 安装包解压2.3 3 安装全局包并创建软链接 3. 安装 git 创建实例略过,点击 SSH 按钮, 在浏览器中打开SSH客户端 注: 本文基于 CentOS 9服务器操作系统 为了方便后面工具插件的顺利安装&a…