python小项目--word文档代码高亮
干货(经验分享+学习笔记)
目录
一.Python模拟键盘点击 实现ctrl+a,ctrl+c,ctrl+v
五.分享:英语四六级,专业四级八级,历年真题听力视频-中英双字幕+日语N3(双字幕)
程序演示
程序工作流程:
1.网络生成:
用户选文本
用户选择按下快捷键程序开始执行
程序Ctrl+c复制文本到解切版。
获取解切板的内容到变量中。
-----------------------------------------
创建浏览器驱动,
打开对应网址,
找到文本输入框的元素,
发送文本到文本框,
找到开始按钮元素,
按下这个元素。
网页进行了跳转。
切换转换后的网页。
剩下的就是ctrl+a+C复制了。
------------------------------------------
最后 退格删除原文本
Ctrl+v粘贴新的高亮代码
2.本地生成:
用户选文本
用户选择按下快捷键程序开始执行
程序Ctrl+c复制文本到解切版。
获取解切板的内容到变量中。
---------------------------------------------------------
将剪切板的文本(代码)转换成 高亮的 html文件
或者 rtf文件(word可读)
用浏览器打开html文件并复制文本。
用word软件打rtf文件并复制。(我并未完全实现)
为什么使用rtf文件呢? 因为我发现 有时候 复制的html文件粘贴后 格式不好,因此用了 rtf文件
----------------------------------------
最后 退格删除原文本
Ctrl+v粘贴新的高亮代码
1.网络生成高亮代码:
2.本地生成代码高亮:
1.本地生成高亮代码_无文本框
2.本地生成高亮代码_有文本框![](https://i-blog.csdnimg.cn/blog_migrate/1ec15fb536b5b3fa6fb7c0d72c3aac43.gif)
3.本地生成高亮代码_有文本框_csdn
4.本地生成高亮代码_粘贴到csdn
一.前言
学习编程的同学可能都有这样的疑问:学编程要不要记笔记呢?
我想答案是肯定的
大家可以看看这一篇文章:
(54条消息) 随笔-学习编程有没有必要做笔记?如何做笔记?_TianXinCoord的博客-CSDN博客_学编程有必要做笔记吗
(54条消息) 编程时,你都用什么软件做的笔记?还是说你都不做笔记?_千锋python和唐唐的博客-CSDN博客_学编程记笔记用什么软件好
那么,问题来了:我们应该是用什么工具来记笔记?
可能会有同学使用word或者sdn来记笔记,在记笔记的过程中,难免少不了要敲代码。
这时候我们敲的代码不能高亮显示,就没有感觉,很头疼。
我也遇到了这样的问题,所以我想解决他。
最开始我是在网上搜可以代码高亮的网站:
代码在线高亮工具 | 将高亮美化的代码一键粘贴到 Word 或 OneNote 中 (highlightcode.com)
不过每次都这样把代码复制到网站上再粘贴下来很麻烦,能不能让它自动给我把代码复制下来,然后再传到网站上,再把网站上的内容给复制下来呢?
方法总归是有的.
我们可以通过Python实现模拟按键,ctrl加C,将文本复制到剪切板。再用Python将剪切板的内容给复制下来.然后用selenium库上传文本到网站上并读取高亮后的结果。最后再模拟模拟按键ctrl加V将高量后的代码粘贴到word中。
理论存在开始编写代码。
不过在编写代码之后,我们又会想到这样一个问题。每次上传到网站上再复制下来,都需要耗费几秒钟的时间。这个时间可能太长了,而且说不定哪一天这个网站它就关闭了。那能不能实现本地自己代码高亮呢?
经过查阅还真发现python提供了这样的代码高亮类库.pygments
这个类库可以将代码高亮后生成各种格式的文件,我想到用它来生成html文件再用浏览器驱动自己打开并复制粘贴。
这个类库还可以生成rtf文件,类似于doc文件,用于复制粘贴更好。后面我也这样去做了.不过发现了一个很头疼的问题他并不能像浏览器打开html文件一样能直接crtl加a,ctrl加c复制。
因为光标没有在文档中,所以不能直接那样做。后面我尝试移动鼠标,先点击文档,再复制。这样做需要获取窗口句柄,获得窗口的坐标和宽度高度,再去移动鼠标点击。之后还需要将光标重新移动到之前的word文档中。很是麻烦。
利用Python可以实现这样的功能的:
模块:pywin32
获取窗口句:
1 | hwnd = win32gui.FindWindow(0, wdname) # 父句柄 |
点击功能:
123 | # win32api.SendMessage(hwnd1, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, long_position) # 模拟鼠标按下 # win32api.SendMessage(hwnd1, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, long_position) # 模拟鼠标弹起 # pyautogui.click(posx, posy) |
最令我疯狂的坑是,获取的word窗口句柄一直不正确,找不到窗口。我换了其他窗口做测试都是可以的,不知道为什么就word不行。功力不够,哈哈哈。由于这些功能也比较麻烦,所以我只做到这里没往下做了。还是决定利用html加浏览器算了。
二.基础知识储备及分享
一.Python模拟键盘点击 实现ctrl+a,ctrl+c,ctrl+v
1.需要的模块:pywin32
好像2017以前叫做win32gui,win32api,win32con,之后改名了:pywin32
Python3.8以上正确安装:
1 | pip install pywin32 |
错误安装:
1 | pip install win32gui |
python - How to install 'win32gui' with `pip`? - Stack Overflow
2.ctrl+c
这个的功能主要是用在:我们的用户选择文字,并执行程序的时候,先把文本给复制到系统剪切板。。
def ctrl_c(self): |
在我调试程序的过程当中我发现ctrl+c这个功能一直实现不了。我想可能是程序执行太快了,没有反应。因此加了
1 | time.sleep(0.3)#此处必须休眠,不然不能复制 |
事实证明这样是对的,甚至当时间小于0.3秒的时候,系统仍没有control+C。
3.ctrl+a,ctrl+c
用语打开html文件的时候,先看ctrl+a全选,在control加C复制选中到系统剪切板。
def ctrl_a_c(self): |
2.这个没有等待时间time.sleep(),但也没有出现bug。
3.退格
我们已经将网页上的高亮代码复制下来了,在粘贴之前我们先需要删除已有的文本。
|
4.ctrl+v
删除之前的文本后,我们就可以粘贴高亮的代码了。
|
5. Python关于键盘控制鼠标控制的其他文章链接。
(54条消息) python鼠标控制_用Python控制鼠标_cumtv80668的博客-CSDN博客
(54条消息) python模拟按键操作_.Wen_Kai的博客-CSDN博客_python 按键
(54条消息) python模拟按键网游_Python 实现键盘鼠标按键模拟_贾震东的博客-CSDN博客
(54条消息) python模拟鼠标和键盘_huxiaoher的博客-CSDN博客_python 模拟鼠标和键盘输入
二.获取剪切板内容
上面的按键模拟是实现了 :将文本内容复制到粘贴板和将文本内容粘贴到word中(并没有涉及到变量。),
而我们的程序需要在用户选择文本之后,CTRL+C复制下来,复制之后,我们便需要从剪切板得到文本,并赋给一个变量方便上传到网站上。或者就实现本地转换。
那么我们该如何将剪切板的内容给一个变量呢?这就用到了下面的模块。
1.需要的模块:pyperclip
安装:
1 | pip install pyperclip |
2.使用:
pyperclip.copy(text) 把text字符串中的字符复制到剪切板
text = pyperclip.paste() 把剪切板上的字符串复制到text
3.参考链接。
(54条消息) Python 将文本复制存入剪切板_Seven_OTM的博客-CSDN博客_python复制到剪贴板
三.web自动化,爬虫。(网络高亮)
0.用途:
好了,现在我们已经从剪切板得到文本并赋值给一个变量了。接下来要做的就是把这个变量上传到网站上。并获取相应的结果。这就涉及到了自动化
具体流程:
用户选文本
用户选择按下快捷键程序开始执行
程序Ctrl+c复制文本到解切版。
获取解切板的内容到变量中。
-----------------------------------------
创建浏览器驱动,
打开对应网址,
找到文本输入框的元素,
发送文本到文本框,
找到开始按钮元素,
按下这个元素。
网页进行了跳转。
切换转换后的网页。
剩下的就是ctrl+a+C复制了。
------------------------------------------
最后退格删除原文本。
Ctrl+v粘贴新的高亮代码。
1.需要的模块:selenium
安装:
1 | pip install selenium |
2.学习自动化推荐
内容十分详细,而且对应b站还有视频讲解。
我只想说分享使一切皆有可能。白嫖是不可能白嫖的。
3.创建浏览器驱动并打开网址(chrome浏览器)
# 创建浏览器驱动 |
值得注意的是,这里并没有使用无头模式。就是没有把浏览器窗口给隐藏。
因为我们是模拟按键ctrl+a+c,所以隐藏窗口之后不能复制到文本。
但我尽量把窗口做了最小化。并且不影响复制的情况下。
设置等待页面响应时间最长等待10秒。
这里需要使用到浏览器驱动软件。打包程序给别人使用的时候,肯定要打包这个驱动软件的。因此我将这个驱动放在程序根目录下。
4.找到页面元素并操作。
找到文本框发送文本,找到开始按钮点击。
# 输入文本 |
服务器响应可能没有那么快,但我们的操作可能太快了,所以需要sleep()一下。
5.跳转标签页。
# 跳转标签页 |
6.复制网页文本
# 复制到剪切版 |
这里需要注意的是全选的时候,如果没有绑定元素,则复制下来的文本没有123这样的行号与背景色。
当然如果你不想要行号,你可以更改.
7.Edge浏览器实现(接if)
else: |
8.可参考的文章链接。
(54条消息) 用python操作浏览器的三种方式_liu_xzhen的博客-CSDN博客_python 操作浏览器
(57条消息) selenium ChromeDriver 中的 options 参数设置_从零开始的数据猿的博客-CSDN博客
(57条消息) selenium add_argument 常用参数列表_小王同学--二蛋的博客-CSDN博客_options.add_argument
(到此处网络高亮代码的过程就实现了。接下来是为了让等待时间更短而实现的本地代码高亮。)
四.本地实现代码高亮
0.用途:
我们除了可以把获得的文本变量上传到网站上之外,也可以通过其他python库实现高亮。
具体流程:
用户选文本
用户选择按下快捷键程序开始执行
程序Ctrl+c复制文本到解切版。
获取解切板的内容到变量中。
---------------------------------------------------------
将剪切板的文本(代码)转换成 高亮的 html文件
或者 rtf文件(word可读)
用浏览器打开html文件并复制文本。
用word软件打rtf文件并复制。(我并未完全实现)
为什么使用rtf文件呢? 因为我发现 有时候 复制的html文件粘贴后 格式不好,因此用了 rtf文件
----------------------------------------
最后退格删除原文本。
Ctrl+v粘贴新的高亮代码。
1.需要的模块:pygments
安装:
1 | pip install pygments |
2.生成html文件
# 函数2 |
3.打开html并复制
# 函数4,复制html中的文本 |
If else 判断采用哪个浏览器
4.可参考的文章链接。
(54条消息) Python编程:使用pygments高亮代码_彭世瑜的博客-CSDN博客_pygments
(54条消息) 关于Python pygments库的简单介绍_九月家的敖烈的博客-CSDN博客_pygments
(54条消息) ActionChains用法_liu_xzhen的博客-CSDN博客_action chains
(54条消息) chrome浏览器的options参数_努力飞翔的笨鸟的博客-CSDN博客_chromeoptions
可用的格式参数(formatter)。
可生成html,rtf文件之外,还可以生成其他文件png...里面都有写。
还可以控制高亮代码的风格参数。
5.生成rtf文件,调用word操作(头疼的地方)
# 2 转换成rtf文件 |
(54条消息) 教你怎么使用Python对word文档进行操作_「违规用户」的博客-CSDN博客_python word
(54条消息) 【RTF】如何使用python读取RTF格式的文件_有人敲门knocky的博客-CSDN博客_python rtf
(54条消息) python模块:win32com用法详解_xi4ojie的博客-CSDN博客_python win32com
这里注意,当你的Rtf文档word中打开时,在程序里打开它,操作它,写入它会报错。
(54条消息) Python如何操作office实现自动化?---win32com.client的运用_行走_的博客-CSDN博客_win32com.client
(54条消息) python模块:win32com用法详解_chinajobs的博客-CSDN博客_win32.dispatch
(54条消息) Python系统调用——运行其他程序_ssihc0的博客-CSDN博客_python操作其他程序
(54条消息) Spy++查看窗口类名和窗口标题名_Mokeri的博客-CSDN博客_查看窗口类名
(54条消息) 学习python窗口句柄、后台鼠标点击等知识笔记_ANTARES!的博客-CSDN博客_python 后台点击
(54条消息) python鼠标控制_用Python控制鼠标_cumtv80668的博客-CSDN博客
(54条消息) 【Python】win32gui.Findwindow(parm1,parm2)窗口句柄获取_ztmajor的博客-CSDN博客_python win32gui.findwindow
(54条消息) python win32api win32gui win32con 窗口句柄 发送消息 常用方法 键盘输入_青盏的博客-CSDN博客_python获取窗口句柄
(54条消息) 如何找到当前桌面某一窗口上的类名_snlei的博客-CSDN博客_窗口类名在哪看
#函数6,复制rtf文件,#必须将word 程序窗口最大化,并且此方法使光标改变了,之后不好再原word中直接复制 |
# 函数5,插入光标,函数6将用到 |
1.要用其他word程序,看看能不能 不用插入光标就能直接复制。
# 函数7 |
太麻烦了,就不想写下去了。当时是写这个程序的,第2天,已经两天不按时吃饭,不按时睡觉,熬夜,身体扛不住了。看来还是要按时作息
2.精疲力尽后,突然想到可以用浏览器打开pdf,所以将rtf文件转换为pdf再打开就好了
#好吧,用浏览器打开pdf也不能直接复制,放弃了
#新发现,浏览器打开pdf复制的文本粘贴到word中,并没有保留格式,所以这条路走不通
#函数8,rtf文件转pdf |
五.参数传递
上述的函数我都定义在一个类中,并通过类的成员变量进行参数传递到成员函数中。
在主函数中创建可视化界面,从可视化界面获得用户输入的参数,
将这些参数赋给这个类的成员变量即可。
|
|
#下拉框,获得方式,网络和本地 |
六.可视化界面的开发
需要安装的模块:tkinter
可参考的文章或链接:
(54条消息) Python-Tkinter图形化界面设计(详细教程 )_王张飞的博客-CSDN博客_tkinter
(54条消息) Tkinter小结 界面+快捷键设置_weixin_33834910的博客-CSDN博客
(54条消息) Python - 编写可视化界面(Python+PyCharm+PyQt)_bailang_zhizun的博客-CSDN博客_python可视化界面编程工具
(54条消息) 用 Python 打造属于自己的GUI图形化界面_Python中文社区的博客-CSDN博客
(54条消息) tkinter库最全使用教程_千禧皓月的博客-CSDN博客_tkinter库
(54条消息) tkinter响应窗口关闭事件_luxingyu329的博客-CSDN博客_tkinter关闭窗口事件
七.为程序运行设置快捷键
说明:
快捷键有两种绑定方式,
一种是为程序按钮绑定快捷键,这种方式只能在程序里起作用。
另外一种可以采用键盘监听,可以全局使用.
1.为按钮绑定快捷键。
bind_all(哪个键, 对应的处理函数) |
(54条消息) Tkinter小结 界面+快捷键设置_weixin_33834910的博客-CSDN博客
# #下拉框,快捷键,不能全局,改用键盘监听。 |
2.键盘监听实现快捷键。
(54条消息) Python键盘监听-捕获输入的键值-鼠标监听_Meruz的博客-CSDN博客_python监听键盘输入
1.问题。
(54条消息) python监听、操作键盘鼠标库pynput详细教程_十年1一梦的博客-CSDN博客_pynput教程(我用了这篇文章中的函数发现有个致命问题。)
#不能添加函数,键盘多次监听
这就会导致用户在按下快捷键的时候,多次重复调用了同一个函数。也就是多次打开浏览器。进行文本复制上传等工作。
from pynput import keyboard def on_activate_h(): print('<ctrl>+<alt>+h pressed')#不能添加函数,键盘多次监听 def on_activate_i(): print('<ctrl>+<alt>+i pressed') def esc(): print('<esc> pressed') return False def esc_shift(): print('<esc>+<shift> pressed') raise Exception with keyboard.GlobalHotKeys({ '<ctrl>+<alt>+h': on_activate_h, '<ctrl>+<alt>+i': on_activate_i, '<esc>': esc, '<esc>+<shift>': esc_shift}) as h: h.join() |
我也确实这样做了。不过发现效果不太理想。找不到一直监听的函数。
2.添加标识符。就算多次调用,只要我标识符没有改变他就不会进入处理函数。
这里我的处理方法是,用定时器。当调用这个函数的时候,触发定时器,三秒之后才才把标识符改变。这三秒内就算再次进入这个函数,也不会调用处理函数。
from pynput import keyboard 我自己写的一个定时器。 |
|
为什么要使用线程?某些函数执行的时间较长。如果放在主线程中就会导致程序画面卡死。因此要放在子线程中。
而此处的键盘监听函数是一直阻塞的,一直循环的,所以要放在线程中.
可参考的文章。
(54条消息) python:threading.Thread类的使用详解_啊啊啊西吧的博客-CSDN博客_python thread
(57条消息) python:threading.Thread类的使用详解_啊啊啊西吧的博客-CSDN博客_python thread
重写run
#监听键盘事件线程,暂时不用 |
直接调用函数。
def run(): |
八.程序的打包发布
1.可参考的文章。
(54条消息) Pyinstaller(Python打包为exe文件)_coco3600的博客-CSDN博客
(54条消息) 将python文件打包成exe可运行文件_菜鸟阿都的博客-CSDN博客_将python文件打包成exe可运行文件
(54条消息) pyinstaller把Python打包成exe去掉黑窗doc窗口问题_wuminminmin的博客-CSDN博客_pyinstaller不显示黑窗口
(54条消息) Pyinstaller 打包exe文件 取消dos窗口(黑框)_whalefall的博客-CSDN博客
注意:
1.我在函数中使多次使用import,这是一个不好的习惯。
按照这位博主的说法。
在这里提醒大家,在代码里面尽量不要用import,能from.....import....就尽量用这个,因为如果是import的话,在打包的时候,会将整个包都打包到exe里面,没有意义的增大了工具的大小!
2.我在安装中遇到的问题。
安装后程序的路径问题,
根据这位博主的说法:
exe文件生成
- 如果程序打包过程没有报错,则会生成3个文件夹(有时候是2个),其中名为dist的文件夹中会有一个myfile.exe文件,运行一下,如果没有问题就打包成功,可以把这个exe文件单独拿出去用,其他的生成的文件夹可以删掉了
我并没有在py文件目录下找到这个dist文件夹。
只有一个pycache文件夹。没有exe文件。
后经搜索发现这个文件夹在另外一个地方。
去掉黑窗口:
安装的时候参数命令加上: -w
浏览器驱动黑窗口存在的问题我无法解决。
三.程序分享下载
1.阿里云盘
「代码高亮」https://www.aliyundrive.com/s/zDM23juXfQj 点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。
2.百度网盘
链接:https://pan.baidu.com/s/1Q6YjRAWF3kYKkJI7lLB0iQ
代码高亮_免费高速下载|百度网盘-分享无限制 (baidu.com)
提取码:mur5
3.csdn
(57条消息) python代码高亮exe(帮助说明在我主页有)-其它文档类资源-CSDN文库
4.注意事项:
1.记事本等普通编辑框不能显示颜色,word等中才可以
2.不要删除目录,保证3个exe文件在同一个文件夹下
3.可以创建一个快捷方式,复制到桌面就好了(鼠标选择 代码高亮.exe 右键添加快捷方式)
4.你可以在文档中选择一段代码,然后ctrl+a全部选中他,再按软件快捷键alt+x,程序就会把代码高光
5.他运行的时候,你的光标不要移动到其他文本编辑框中
四.源代码分享
1.github
2.csdn
# -*- coding: utf-8 -*-
# @Date : 2022-3-27
# @Author : tian maofu
from pygments import highlight
from pygments.formatters.html import HtmlFormatter
from pygments.formatters.rtf import RtfFormatter
from pygments.lexers import guess_lexer
import os
import pyperclip
import time
import sys,io
class codelight():
def __init__(self):
self.codestyle = 'default'
# 将一个浏览器驱动放到程序根目录下,用户就不用配置浏览器驱动了
outpath = os.getcwd()
self.dirverfilename_chome = outpath + '\\chromedriver.exe'
self.dirverfilename_edge=outpath + '\\msedgedriver.exe'
self.dirverfilename=self.dirverfilename_edge
self.start_onlineget=False
#标识,防止多次响应键盘快捷键
self.runing_eventhandler=False
#代码高亮文本框(bool
self.text_box=False
# 网络得到
def getcodelight_byonline(self):
# 浏览器
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
import time
#ctrl+,c
self.ctrl_c()
#删除
self.backspace()
# 从剪切版获取文本
wenben_str=self.getcode()
# 创建浏览器驱动
#选择浏览器
if self.dirverfilename == self.dirverfilename_chome:
options = webdriver.ChromeOptions()
prefs = {"profile.managed_default_content_settings.images": 2} # 设置浏览器禁止加载图片
options.add_experimental_option("prefs", prefs)
# options.add_argument('--headless')# 关闭窗口后,无法复制
options.add_argument('window-size=300x400')
options.add_argument('--disable-gpu') # 禁用显卡
options.add_argument("--user-agent=Mozilla/5.0 HAHA") # 替换UA
chrome=webdriver.Chrome(chrome_options=options,service=Service(r'{}'.format(self.dirverfilename))) # r 代表\号不转写,转义
chrome.implicitly_wait(10)
# options.add_argument('window-size=300x200')好像不行,用如下方法
chrome.set_window_size(300, 400)
# chrome.minimize_window()
print("分辨率", chrome.get_window_size())
# 网址
chrome.get("https://highlightcode.com/")
# 输入文本
# time.sleep(0.5)
element_textedit = chrome.find_element(By.ID, "textarea")
element_textedit.clear()
element_textedit.send_keys(wenben_str)
# 点击
time.sleep(0.1)
element = chrome.find_element(By.CSS_SELECTOR, "div>button")
element.click()
# 跳转标签页
time.sleep(0.3) # 间隔太短,复制为空
for handle in chrome.window_handles:
# 先切换到该窗口
chrome.switch_to.window(handle)
# 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口
if '复制即可' in chrome.title:
# 如果是,那么这时候WebDriver对象就是对应的该该窗口,正好,跳出循环,
break
# 复制到剪切版
# key_down(value, element=None) ——按下某个键盘上的键
# key_up(value, element=None) ——松开某个键
time.sleep(0.3) # 间隔太短,复制为空
element = chrome.find_element(By.CSS_SELECTOR, 'body > app-root > app-render > pre')
action = ActionChains(chrome)
action.key_down(Keys.CONTROL, element).send_keys("a").key_up(Keys.CONTROL, element).perform() # ctrl+a
# 如果不加元素element,也可以复制,不过格式不全
'''
不全的格式
MainWindow::~MainWindow()
{
delete ui;
}
应该的格式
1.
MainWindow::~MainWindow()
2.{
3. delete ui;
4.}
'''
time.sleep(0.3) # 间隔太短,复制为空
action.key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform() # ctrl+c
print('已复制')
chrome.quit()
else:
from selenium.webdriver.edge.service import Service
options = webdriver.EdgeOptions()
prefs = {"profile.managed_default_content_settings.images": 2} # 设置浏览器禁止加载图片
options.add_experimental_option("prefs", prefs)
# options.add_argument('--headless')# 关闭窗口后,无法复制
options.add_argument('window-size=300x400')
options.add_argument('--disable-gpu') # 禁用显卡
options.add_argument("--user-agent=Mozilla/5.0 HAHA") # 替换UA
edge = webdriver.Edge(options=options,service=Service(r'{}'.format(self.dirverfilename))) # r 代表\号不转写,转义
edge.implicitly_wait(10)
# options.add_argument('window-size=300x200')好像不行,用如下方法
edge.set_window_size(300, 400)
# edge.minimize_window()
print("分辨率", edge.get_window_size())
# 网址
edge.get("https://highlightcode.com/")
# 输入文本
# time.sleep(0.5)
element_textedit = edge.find_element(By.ID, "textarea")
element_textedit.clear()
element_textedit.send_keys(wenben_str)
# 点击
time.sleep(0.1)
element = edge.find_element(By.CSS_SELECTOR, "div>button")
element.click()
# 跳转标签页
time.sleep(0.3) # 间隔太短,复制为空
for handle in edge.window_handles:
# 先切换到该窗口
edge.switch_to.window(handle)
# 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口
if '复制即可' in edge.title:
# 如果是,那么这时候WebDriver对象就是对应的该该窗口,正好,跳出循环,
break
# 复制到剪切版
# key_down(value, element=None) ——按下某个键盘上的键
# key_up(value, element=None) ——松开某个键
time.sleep(0.3) # 间隔太短,复制为空
element = edge.find_element(By.CSS_SELECTOR, 'body > app-root > app-render > pre')
action = ActionChains(edge)
action.key_down(Keys.CONTROL, element).send_keys("a").key_up(Keys.CONTROL, element).perform() # ctrl+a
# 如果不加元素element,也可以复制,不过格式不全
'''
不全的格式
MainWindow::~MainWindow()
{
delete ui;
}
应该的格式
1.
MainWindow::~MainWindow()
2.{
3. delete ui;
4.}
'''
time.sleep(0.3) # 间隔太短,复制为空
action.key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform() # ctrl+c
print('已复制')
edge.quit()
#粘贴:
self.ctrl_v()
#本地生成:
# 将剪切板的文本(代码)转换成 高亮的 html文件 或者 rtf文件(word可度)
# 再将文本读到剪切版
# 函数1,获取剪切板代码
def getcode(self):
# 从剪切版获取文本
code = pyperclip.paste() # 从剪切版获取文本
code = '''{}'''.format(code)
#print(code)
return code
# 需要高亮的语言
# 手动
# lexer = PythonLexer()
# lexer = get_lexer_by_name("python")#(二选一即可)
# 自动判断语言
# lexer = guess_lexer(code)
# 两种方式获取高亮代码
# 1 转换成html文件
# 函数2
def tohtml(self, code):
# 自动判断语言
lexer = guess_lexer(code)
# 输出文件名,outfilename
outpath = os.getcwd()
outfilename = outpath + '\\temp.html'
outcss = outpath + "\\temp.css"
# 指定高亮风格,结合下拉框
formatter = HtmlFormatter(style=self.codestyle)
#其他参数:noclasses,nowrap,https://pygments.org/docs/formatters/
if self.text_box==True:
formatter.linenos = True
# 获取css
cssfile = open(outcss, "w")
css = formatter.get_style_defs('.highlight')
# print(css)
cssfile.writelines(css)
# 获取html
htmlfile = open(outfilename, "w",encoding='utf-8') # 直接打开一个文件,如果文件不存在则创建文件,
# html = highlight(code, lexer,HtmlFormatter(), htmlfile)#可以直接写入,但我们需要链接css到html中,因此自己写
html = highlight(code, lexer, formatter)
htmlfile.write('<link rel="stylesheet" href="temp.css" type="text/css" /> \n') # 把str写到文件中,write()并不会在str后加上一个换行符
htmlfile.writelines(html)
#print(html)
# 关闭文件
htmlfile.close() # 关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。 如果一个文件在关闭后还对其进行操作会产生ValueError
cssfile.close()
return outfilename # 返回文件的字符路径,不是htmlfile文件
'''
# 2 转换成rtf文件
# 函数3
def totrf(self, code):
# 自动判断语言
lexer = guess_lexer(code)
# 输出文件名,outfilename
outpath = os.getcwd()
outfilename = outpath + '\\temp.rtf'
trffile = open(outfilename, 'w') # 打开输入文件
trf = highlight(code, lexer, RtfFormatter(), trffile) # 参数:代码,语言,格式,输出文件
# 关闭
trffile.close()
return outfilename # 返回文件的字符路径,不是htmlfile文件
'''
# 函数4,复制html中的文本
def get_htmlText(self, htmlfile):
# 浏览器
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
import time
import os
# 创建浏览器驱动
# options.add_argument('--headless')# 关闭窗口后,无法复制
if self.dirverfilename==self.dirverfilename_chome:
chrome = webdriver.Chrome(service=Service(r'{}'.format(self.dirverfilename))) # r 代表\号不转写,转义
chrome.implicitly_wait(10)
chrome.set_window_size(300, 400)
# chrome.minimize_window()
print("分辨率", chrome.get_window_size())
# 网址,html文件
chrome.get(htmlfile)
# 复制文本
action = ActionChains(chrome)
action.key_down(Keys.CONTROL).send_keys("a").key_up(Keys.CONTROL).perform() # ctrl+a
action.key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform() # ctrl+c
else:
edge=webdriver.Edge(service=Service(r'{}'.format(self.dirverfilename_edge)))
edge.implicitly_wait(10)
edge.set_window_size(300,400)
edge.get(htmlfile)
action=ActionChains(edge)
action.key_down(Keys.CONTROL).send_keys("a").key_up(Keys.CONTROL).perform() # ctrl+a
action.key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform() # ctrl+c
'''
# 函数5,插入光标,函数6将用到
def doClick(self):
import win32con
import win32api,win32gui
import pyautogui
#获取窗口句柄:有一些窗口不能正常得到句柄
# wdname = u'Microsoft Word 文档'
# hwnd = win32gui.FindWindow(0, wdname) # 父句柄
# hwnd1 = win32gui.FindWindowEx(None,None,None, '网易有道词典') # 子句柄FindWindowEx
# 窗口大小
# windowRec = win32gui.GetClientRect(hwnd1) # 目标子句柄窗口的大小
# print('windowRec',windowRec)#(676, 254, 1006, 724)#这个坐标不对
#点击,无语了,不是我想要的点击
#size = windowRec
# sizew=size[2]
# sizeh=size[3]
# sizew=int(sizew/2)
# sizeh=int(sizeh/2)
# long_position = win32api.MAKELONG(340,170 ) # 模拟鼠标指针 传送到指定坐标 #long_position = win32api.MAKELONG(size[2]/2, size[3]/2) # 模拟鼠标指针 传送到指定坐标
# win32api.SendMessage(hwnd1, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, long_position) # 模拟鼠标按下
# win32api.SendMessage(hwnd1, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, long_position) # 模拟鼠标弹起
# 点击#上面的坐标不对,只好,将文档窗口最大化,点击屏幕中间了
# posx=windowRec[0]
# posy=windowRec[1]
# sizew=windowRec[2]
# sizeh=windowRec[3]
# sizew=int(sizew/2)
# sizeh=int(sizeh/2)
# pyautogui.click(posx, posy)
# print('已点击')
#最大化后点击
pinmupos=pyautogui.size()#屏幕大小
print('pinmupos', pinmupos)
posx=pinmupos.width/2;print(posx) #pinmupos.width()/2 不对
posy=pinmupos.height/2;print(posy)
pyautogui.click(posx,posy)
#函数6,复制rtf文件,#必须将word 程序窗口最大化,并且此方法使光标改变了,之后不好再原word中直接复制
def get_rtfText_1(self,rtffile):
from win32com.client import DispatchEx
from win32com.client import Dispatch
import win32api
# 打开word应用程序
word = Dispatch('Word.Application')#此方法不能指定程序,有一些word程序打开rtf文件后,不能直接复制,就需要移动光标
#word = DispatchEx('Word.Application') # 启动独立的进程
word.Visible = 1 # 0后台运行,不显示
word.DisplayAlerts = 0 # 不警告
#打开文档
doc = word.Documents.Open(FileName=rtffile, Encoding='gbk')
#必须将word 程序窗口最大化
#插入光标,不像html文件打开那样,可以直接复制
#self.doClick()
# 复制ctrl+a,ctrl+c
ob.ctrl_a_c()
#关闭
doc.Close()
word.Quit()
# 函数7
def get_rtfText_2(slef,rtffile):
import win32api
outpath=os.getcwd()
rtfexefile=r'F:\1\金山文档\金山文档.exe'
# rtfexefile=outpath+'\\wordpad.exe'
print(rtfexefile)
# 打开记事本程序,获得其句柄
win32api.ShellExecute(0, 'open', rtfexefile,'F:/temp.rtf', '', 0)
print(rtffile)
#如何关闭
#函数8,rtf文件转pdf
def wordTopdf(self,doc_name, pdf_name):
"""
:word文件转pdf
:param doc_name word文件名称
:param pdf_name 转换后pdf文件名称
"""
import os
import sys
from win32com import client
# pip install win32com
try:
word = client.DispatchEx("Word.Application")#后台进程
if os.path.exists(pdf_name):
os.remove(pdf_name)
worddoc = word.Documents.Open(doc_name, ReadOnly=1)
worddoc.SaveAs(pdf_name, FileFormat=17)
worddoc.Close()
word.Quit()
return pdf_name
except:
return 1
'''
def ctrl_c(self):
import win32api
import win32con
#win32api.keybd_event(0x11, win32api.MapVirtualKey(0x11, 0), win32con.KEYEVENTF_KEYUP, 0)#必须先释放ctrl ,因为快捷键有ctrl,人的释放可能太慢了,
time.sleep(0.3)#此处必须休眠,不然不能复制
win32api.keybd_event(0x11, win32api.MapVirtualKey(0x11, 0), 0, 0)
win32api.keybd_event(0x43, win32api.MapVirtualKey(0x43, 0), 0, 0)
time.sleep(0.2)#此处必须休眠,不然不能复制
win32api.keybd_event(0x43, win32api.MapVirtualKey(0x43, 0), win32con.KEYEVENTF_KEYUP, 0)
win32api.keybd_event(0x11, win32api.MapVirtualKey(0x11, 0), win32con.KEYEVENTF_KEYUP, 0)
def ctrl_a_c(self):
# 复制ctrl+a,ctrl+c
# 模拟按键 ctrl:0x11,a:0x41,c:0x43
import win32api
import win32con
win32api.keybd_event(0x11, win32api.MapVirtualKey(0x11, 0), 0, 0)
win32api.keybd_event(0x41, win32api.MapVirtualKey(0x41, 0), 0, 0)
win32api.keybd_event(0x41, win32api.MapVirtualKey(0x41, 0), win32con.KEYEVENTF_KEYUP, 0)
win32api.keybd_event(0x43, win32api.MapVirtualKey(0x43, 0), 0, 0)
win32api.keybd_event(0x11, win32api.MapVirtualKey(0x11, 0), win32con.KEYEVENTF_KEYUP, 0)
win32api.keybd_event(0x43, win32api.MapVirtualKey(0x43, 0), win32con.KEYEVENTF_KEYUP, 0)
def backspace(self):
import win32api
import win32con
win32api.keybd_event(0x08, win32api.MapVirtualKey(0x08, 0), win32con.KEYEVENTF_KEYUP, 0)
win32api.keybd_event(0x08, win32api.MapVirtualKey(0x08, 0), 0, 0)
win32api.keybd_event(0x08, win32api.MapVirtualKey(0x08, 0), win32con.KEYEVENTF_KEYUP, 0)
def ctrl_v(self):
import win32api
import win32con
win32api.keybd_event(0x11, win32api.MapVirtualKey(0x11, 0), win32con.KEYEVENTF_KEYUP, 0)
win32api.keybd_event(0x56, win32api.MapVirtualKey(0x56, 0), win32con.KEYEVENTF_KEYUP, 0)
win32api.keybd_event(0x11, win32api.MapVirtualKey(0x11, 0), 0, 0)
win32api.keybd_event(0x56, win32api.MapVirtualKey(0x56, 0), 0, 0)
win32api.keybd_event(0x11, win32api.MapVirtualKey(0x11, 0), win32con.KEYEVENTF_KEYUP, 0)
win32api.keybd_event(0x56, win32api.MapVirtualKey(0x56, 0), win32con.KEYEVENTF_KEYUP, 0)
def getcodelight_byself(self):
ob.ctrl_c()
# time.sleep(0.7)#不用休眠
#print('deleter')
# 删除选中文本
ob.backspace()
#print('html')
# 从剪切板得到代码
code = ob.getcode()
# rtffile=ob.totrf(code)#生成rtf
# ob.get_rtfText_2(rtffile)
htmlfile = ob.tohtml(code)
ob.get_htmlText(htmlfile)
# 粘贴新代码
ob.ctrl_v()
# 快捷键函数
def eventhandler(self):
self.runing_eventhandler = True
if self.start_onlineget==True:
self.getcodelight_byonline()#网络获取
else:
self.getcodelight_byself()
#print(' def eventhandler(self):')
class mytimer:
def __init__(self, ):
self.timerstop = False
self.miaoshu = 0
self.shurumiaoshu = None
def start(self):
def fun_timer():
self.miaoshu += 1
# print('self.timerstop=', self.timerstop)
# print('当前秒数:', self.miaoshu)
if self.timerstop == True:
return 'timeout'
if self.miaoshu == self.shurumiaoshu:
# wanttodo:x
ob.runing_eventhandler = False
return 'timeout'
# wanttodo:
#print('Hello Timer!')
global timer
timer = threading.Timer(1, fun_timer)
timer.start()
timer = threading.Timer(1, fun_timer)
timer.start()
def stop(self):
self.timerstop = True
'''
#监听键盘事件线程,暂时不用
import threading
class MyThread(threading.Thread):
def __init__(self,kuijianjie):
super(MyThread, self).__init__() # 重构run函数必须写
self.kuijianjie = 1
self.kuijianjie=kuijianjie
def run(self):
from pynput import keyboard
def on_activate_h():
print('<ctrl>+<alt> pressed')
eventhandler()#调用函数,时会重复监听,所以可以添加标识符,不要重复调用eventhandler()
return False
def on_activate_i():
print('<ctrl>+/ pressed')
eventhandler()
return False
def esc():
print('<esc> pressed')
return False
def esc_shift():
print('<esc>+<shift> pressed')
return False
with keyboard.GlobalHotKeys({
'<ctrl>+<alt>': on_activate_h,
'<ctrl>+/': on_activate_i,
'<esc>': esc,
'<esc>+<shift>': esc_shift}) as h:
h.join()
'''
if __name__ == '__main__':
# 实例化
ob = codelight()
#窗口
from tkinter import *
root = Tk()
def destroy():
root.destroy()
root.wm_attributes('-topmost', 1)#置顶
root.title("MaofU代码高亮")
root.geometry('200x280')
root.protocol('WM_DELETE_WINDOW',destroy )
#按钮
#btn = Button(root, text='快捷键ctrl+f')
#btn.bind_all('<Control-f>', eventhandler)
#btn.pack()#不显示
# 上面的快捷键不能全局
# 采用监听
# mythread = MyThread(1)
# mythread.start()#不能退出
def run():
print('test')
from pynput import keyboard
def on_activate_ctrl_x():
#不能添加函数,键盘多次监听
if ob.runing_eventhandler==False:#调用函数时会重复监听,所以可以添加标识符,不要重复调用eventhandler()
ob.runing_eventhandler = True
ob.eventhandler()
# 标识,两秒后再把标识==false
mytim = mytimer()
mytim.start()
mytim.shurumiaoshu = 3
print('x,e+<alt> pressed')
else:
return
def esc():
print('<esc> pressed')
root.destroy()
with keyboard.GlobalHotKeys({
'x+<alt>': on_activate_ctrl_x,'e+<alt>': on_activate_ctrl_x,'<alt>+w': esc}) as h:
h.join()
import threading
thread=threading.Thread(target=run)
thread.setDaemon(True)#守护线程
thread.start()
#下拉框,获得方式,网络和本地
from tkinter.ttk import *
def getcodelightway(arg):
if comb_getway.current()==0:
ob.start_onlineget=True
else:
ob.start_onlineget=False
comb_getway = Combobox(root, textvariable=StringVar(), values=['网络抓取', '本地生成'])
comb_getway.place(relx=0, rely=0.6, relwidth=1)
comb_getway.bind('<<ComboboxSelected>>', getcodelightway) # 事件
#高亮风格
def calc(arg):#处理函数
dic ={0: 'default', 1: 'emacs', 2: 'friendly', 3:'colorful',4:'autumn',5:'murphy',6:'manni',7:'monokai',8:'perldoc',9:'pastie',10:'borland',11:'trac',12:'native',13:'fruity',14:'bw',15:'vim',16:'vs',17:'tango',18:'rrt',19:'xcode',20:'igor',
21:'paraiso-light',22:'paraiso-dark',23:'lovelace',24:'algol',25:'algol_nu',26:'arduino',27:'rainbow_dash',28:'abap'}
var = dic[comb.current()]
ob.codestyle=var
print(ob.codestyle)
#下拉框,代码风格
var = StringVar()
comb = Combobox(root, textvariable=var, values=['default', 'emacs', 'friendly', 'colorful','autumn','murphy','manni','monokai','perldoc','pastie',
'borland' ,"trac",
"native",
"fruity",
"bw",
"vim",
"vs",
"tango",
"rrt",
"xcode",
"igor",
"paraiso-light",
"paraiso-dark",
"lovelace",
"algol",
"algol_nu",
"arduino",
"rainbow_dash",
"abap"
])
comb.place(relx=0, rely=0.7, relwidth=1)
comb.bind('<<ComboboxSelected>>', calc)#事件
#下拉框,浏览器
def selectdiver(arg):
if comb_dirver.current()==0:
ob.dirverfilename=ob.dirverfilename_chome
else:
ob.dirverfilename=ob.dirverfilename_edge
var_dirver = StringVar()
comb_dirver = Combobox(root, textvariable=var_dirver, values=['谷歌chome浏览器','微软edge浏览器'])
comb_dirver.place(relx=0, rely=0.8, relwidth=1)
comb_dirver.bind('<<ComboboxSelected>>', selectdiver) # 事件
#下拉框,高亮文本框
def sel_textbox(arg):
if comb_textbox.current()==0:
ob.text_box=True
else:
ob.text_box=False
comb_textbox = Combobox(root, textvariable=StringVar(), values=['开启高亮文本框', '不开启高亮文本框'])
comb_textbox.place(relx=0, rely=0.9, relwidth=1)
comb_textbox.bind('<<ComboboxSelected>>',sel_textbox ) # 事件
# 标签
lb = Label(root,text='下拉框1:选择获取方式(默认本地)\n下拉框2:选择高亮风格\n下拉框3:选择浏览器(默认edge)\n下拉框4:代码高亮文本框(默认不开启)(文本框可以在word,csdn等中调整)\n(请保持程序根目录下的浏览器驱动与你的浏览器版本一致,更换时,驱动名字要与之前的一致)\n\n'
'快捷键执行:(alt+x,alt+e)(程序可最小化)\n快捷退出:alt+w\n1.程序工作时,请保持光标在需要工作的位置2.粘贴地方不同,文本格式不同',
font=("楷体", 13))
lb.place(relx=0, rely=0.1)
lb.pack()
# 设置label标签
link =Label(root,text='更多帮助点击这里呀!!!!!!!!',font=('楷体', 13))
link.place(relx=0, rely=0.5)
# 此处必须注意,绑定的事件函数中必须要包含event参数
import webbrowser
def open_url(event):
webbrowser.open("https://blog.csdn.net/qq_62595450?spm=1000.2115.3001.5343", new=0)
# 绑定label单击事件
link.bind("<Button-1>", open_url)
root.mainloop()
# #下拉框,快捷键,不能全局,改用键盘监听。
# def kuaijianjie(arg):
# if comb_kuai.current()==0:
# # btn.bind_all('<Control-f>',eventhandler)
# mythread.kuijianjie=0
# if comb_kuai.current()==1:
# # btn.bind_all('<Alt-x>', eventhandler)
# mythread.kuijianjie = 1
# if comb_kuai.current()==2:
# # btn.bind_all('<Alt-b>', eventhandler)
# mythread.kuijianjie = 2
# var_kuai = StringVar()
# comb_kuai = Combobox(root, textvariable=var_kuai, values=['ctrl+f', 'alt+x','alt+b'])
# comb_kuai.place(relx=0, rely=0.8, relwidth=1)
# comb_kuai.bind('<<ComboboxSelected>>', kuaijianjie) # 事件
#说明:为实现复制trf文件内容,我写了 def get_rtfText_1(self,rtffile): def get_rtfText_2(self,rtffile):
#两个函数,利用Word软件打开rtf,并复制,可是问题在于并不能直接复制(因为光标没在word中),因此还想了去移动光标,可是还是存在许多问题
#
#精疲力尽后,突然想到可以用浏览器打开pdf,所以将rtf文件转换为pdf再打开就好了
#好吧,用浏览器打开pdf也不能直接复制,放弃了
#新发现,浏览器打开pdf复制的文本粘贴到word中,并没有保留格式,所以这条路走不通
#为什么使用rtf文件呢? 因为我发现 有时候 复制的html文件粘贴后 格式不对,因此用了 rtf文件
#注意,浏览器要与浏览器驱动版本差不多
# 其他,查看支持的风格
'''
from pygments.styles import STYLE_MAP
for key in STYLE_MAP.keys():
print(key)
"""
default
emacs
friendly
colorful
autumn
murphy
manni
monokai
perldoc
pastie
borland
trac
native
fruity
bw
vim
vs
tango
rrt
xcode
igor
paraiso-light
paraiso-dark
lovelace
algol
algol_nu
arduino
rainbow_dash
abap
"""
类 RtfFormatter
短名称
rtf
文件名
*.rtf
将标记格式化为 RTF 标记。此格式化程序会自动输出包含颜色信息和其他有用内容的完整 RTF 文档。非常适合复制和粘贴到Microsoft(R)Word(R)文档中。
请注意,和选项将被忽略。RTF 格式本身是 ASCII,但由于使用了转义序列,因此可以正确处理 unicode 字符。encodingoutencoding
0.6 版中的新功能。
接受的其他选项:
风格
要使用的样式可以是字符串或 Style 子类(默认:)。'default'
字体
使用的字体系列,例如 。默认为一些应该具有固定宽度的通用字体。Bitstream Vera Sans
字体大小
所用字体的大小。大小以半点为单位指定。默认值为 24 个半点,字体大小为 12。
2.0 版中的新功能。
'''
五.分享:英语四六级,专业四级八级,历年真题听力视频-中英双字幕+日语N3(双字幕)
1.简介:
假期的时候用qt写了个制作中英双字幕视频的程序,
并在B站发布了这些视频.如果正好有需要的同学可以去看看哟!
由于,是第一次写的程序,代码比较凌乱,暂不分享了.
2.视频链接:
1.六级
CET6 全国六级听力考试(中英双字幕)(翻译)_哔哩哔哩_bilibili
【六级听力历年合集】2021年06月六级听力第二套精听(优化版,一周二更)_哔哩哔哩_bilibili
2.四级
CET4 全国大学英语 四级听力考试(中英双字幕)(翻译)(2015年至今)_哔哩哔哩_bilibili
【四级听力】历年真题 大合集(中英双字幕:翻译)(优化版)_哔哩哔哩_bilibili
专四
3.TEM4 英语专四 听力真题(2009~2021年合集) (中英双字幕)(翻译)_哔哩哔哩_bilibili
专八
4.TEM 英语专八听力真题(2009~2021年合集) (中英双字幕)(翻译)_哔哩哔哩_bilibili
日语n3
5.日语N3听力历年真题(双字幕)(翻译)_哔哩哔哩_bilibili
6.其他:
[B站首发] 经典影视学外语 (中英语言)练习口语和听力(有盲听部分)千寻_哔哩哔哩_bilibili
[B站首发] 经典影视学外语 (中英日三国语言)练习口语和听力(有盲听部分)(更新ing)5_哔哩哔哩_bilibili
六.后记(转载注明出处)
1.感谢:
谢谢各位大佬免费分享的各类编程知识!!!
2.小白刚上大一,经验也不是很足,文章中出错的,代码不好的...还请多多担待哈!
3.以前看别人写文章都说:码字不易.今天我是体会到了!
如果文章的某些部分对你有帮助,也请多多支持一下.只为了能帮到更多的人呀!
4.小白温馨提醒:各位要按时休息,吃饭呀.这几天写程序入迷了,熬夜,不按时吃饭,搞的身体很难受...这样不行呀
5.谢谢观看!