python小项目--word文档代码高亮(经验分享+学习笔记)

python小项目--word文档代码高亮

干货(经验分享+学习笔记)

目录

python小项目--word文档代码高亮

干货(经验分享+学习笔记)

程序演示

程序工作流程:

1.网络生成:

2.本地生成:

1.网络生成高亮代码:

2.本地生成代码高亮:

1.本地生成高亮代码_无文本框

2.本地生成高亮代码_有文本框

3.本地生成高亮代码_有文本框_csdn

4.本地生成高亮代码_粘贴到csdn

一.前言

二.基础知识储备及分享

一.Python模拟键盘点击 实现ctrl+a,ctrl+c,ctrl+v

1.需要的模块:pywin32

2.ctrl+c

1.用途:

2.Bug与坑:

3.ctrl+a,ctrl+c

1.用途:

3.退格

1.用途:

4.ctrl+v

1.用途:

5. Python关于键盘控制鼠标控制的其他文章链接。

二.获取剪切板内容

1.需要的模块:pyperclip

2.使用:

3.参考链接。

三.web自动化,爬虫。(网络高亮)

0.用途:

具体流程:

1.需要的模块:selenium

2.学习自动化推荐

3.创建浏览器驱动并打开网址(chrome浏览器)

bug与坑:

4.找到页面元素并操作。

bug与坑:

5.跳转标签页。

6.复制网页文本

bug与坑:

7.Edge浏览器实现(接if)

8.可参考的文章链接。

四.本地实现代码高亮

0.用途:

具体流程:

1.需要的模块:pygments

2.生成html文件

3.打开html并复制

注意:

4.可参考的文章链接。

5.生成rtf文件,调用word操作(头疼的地方)

5.0生成rtf文件

5.1调用word软件复制文本

五.参数传递

六.可视化界面的开发

需要安装的模块:tkinter

可参考的文章或链接:

七.为程序运行设置快捷键

说明:

1.为按钮绑定快捷键。

参考文章。

2.键盘监听实现快捷键。

可参考的文章。

1.问题。

2.解决方法。

3.使用线程。

八.程序的打包发布

1.可参考的文章。

2.我在安装中遇到的问题。

三.程序分享下载

1.阿里云盘

2.百度网盘

3.csdn

4.注意事项:

四.源代码分享

1.github

2.csdn

五.分享:英语四六级,专业四级八级,历年真题听力视频-中英双字幕+日语N3(双字幕)

1.简介:

2.视频链接:

六.后记(转载注明出处)

1.感谢:

程序演示

程序工作流程:

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.本地生成高亮代码_有文本框

 

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

Pygments 文档 — 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

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)

2.Bug与坑:

在我调试程序的过程当中我发现ctrl+c这个功能一直实现不了。我想可能是程序执行太快了,没有反应。因此加了

1

time.sleep(0.3)#此处必须休眠,不然不能复制


事实证明这样是对的,甚至当时间小于0.3秒的时候,系统仍没有control+C。

3.ctrl+a,ctrl+c

1.用途:

用语打开html文件的时候,先看ctrl+a全选,在control加C复制选中到系统剪切板。

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)

2.这个没有等待时间time.sleep(),但也没有出现bug。

3.退格

1.用途:

我们已经将网页上的高亮代码复制下来了,在粘贴之前我们先需要删除已有的文本。


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)

4.ctrl+v

1.用途:

删除之前的文本后,我们就可以粘贴高亮的代码了。


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)

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.学习自动化推荐

原理与安装 | 白月黑羽 (byhy.net)

内容十分详细,而且对应b站还有视频讲解。

我只想说分享使一切皆有可能。白嫖是不可能白嫖的。

3.创建浏览器驱动并打开网址(chrome浏览器)

# 创建浏览器驱动
#选择浏览器
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/")

bug与坑:

值得注意的是,这里并没有使用无头模式。就是没有把浏览器窗口给隐藏。

因为我们是模拟按键ctrl+a+c,所以隐藏窗口之后不能复制到文本。

但我尽量把窗口做了最小化。并且不影响复制的情况下。

设置等待页面响应时间最长等待10秒。

这里需要使用到浏览器驱动软件。打包程序给别人使用的时候,肯定要打包这个驱动软件的。因此我将这个驱动放在程序根目录下。

4.找到页面元素并操作。

找到文本框发送文本,找到开始按钮点击。

# 输入文本
# 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()

bug与坑:

服务器响应可能没有那么快,但我们的操作可能太快了,所以需要sleep()一下。

5.跳转标签页。

# 跳转标签页
time.sleep(0.3)  # 间隔太短,复制为空
for handle in chrome.window_handles:
    # 先切换到该窗口
    chrome.switch_to.window(handle)
    # 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口
    if '复制即可' in chrome.title:
        # 如果是,那么这时候WebDriver对象就是对应的该该窗口,正好,跳出循环,
        break

6.复制网页文本

# 复制到剪切版
    # 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()

bug与坑:

这里需要注意的是全选的时候,如果没有绑定元素,则复制下来的文本没有123这样的行号与背景色。

当然如果你不想要行号,你可以更改.

7.Edge浏览器实现(接if)

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()

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

Pygments 文档 — Pygments

2.生成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)#可以直接写入,但我们需要链接csshtml,因此自己写
    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文件

3.打开html并复制

# 函数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

注意:

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

Pygments 文档 — Pygments

可用的格式参数(formatter)。

可用的词法学家 — Pygments

可生成html,rtf文件之外,还可以生成其他文件png...里面都有写。

还可以控制高亮代码的风格参数。

5.生成rtf文件,调用word操作(头疼的地方)

5.0生成rtf文件

# 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文件

5.1调用word软件复制文本

需要安装的模块:pywin32

可参考的文章链接:

(54条消息) 教你怎么使用Python对word文档进行操作_「违规用户」的博客-CSDN博客_python word

(54条消息) 【RTF】如何使用python读取RTF格式的文件_有人敲门knocky的博客-CSDN博客_python rtf

(54条消息) python模块:win32com用法详解_xi4ojie的博客-CSDN博客_python win32com

(54条消息) 排坑:运行win32com.client.Dispatch('Word.Application')和docx.Documents.Open()报错_zw05011的博客-CSDN博客_client.dispatch

这里注意,当你的Rtf文档word中打开时,在程序里打开它,操作它,写入它会报错。

(54条消息) Python如何操作office实现自动化?---win32com.client的运用_行走_的博客-CSDN博客_win32com.client

(54条消息) python模块:win32com用法详解_chinajobs的博客-CSDN博客_win32.dispatch

(54条消息) Python系统调用——运行其他程序_ssihc0的博客-CSDN博客_python操作其他程序

1.打开word,寻找窗口句柄,定位,鼠标点击,插入光标法

(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博客_窗口类名在哪看

2.直接最大化窗口,点击屏幕中间插入光标。

#函数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()

# 函数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)

3.其他想法。

1.要用其他word程序,看看能不能 不用插入光标就能直接复制。

# 函数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)

            #如何关闭

太麻烦了,就不想写下去了。当时是写这个程序的,第2天,已经两天不按时吃饭,不按时睡觉,熬夜,身体扛不住了。看来还是要按时作息

2.精疲力尽后,突然想到可以用浏览器打开pdf,所以将rtf文件转换为pdf再打开就好了
#好吧,用浏览器打开pdf也不能直接复制,放弃了
#新发现,浏览器打开pdf复制的文本粘贴到word中,并没有保留格式,所以这条路走不通

#函数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

五.参数传递

上述的函数我都定义在一个类中,并通过类的成员变量进行参数传递到成员函数中。

在主函数中创建可视化界面,从可视化界面获得用户输入的参数,

将这些参数赋给这个类的成员变量即可。


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


if __name__ == '__main__':
    # 实例化
    ob = codelight()

    #窗口
    from tkinter import *
    root = Tk()
    def destroy():
        root.destroy()

    root.wm_attributes('-topmost', 1)
    root.title("Tmaof代码高亮")
    root.geometry('200x280')
    root.protocol('WM_DELETE_WINDOW',destroy )

#下拉框,获得方式,网络和本地
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)  # 事件

六.可视化界面的开发

需要安装的模块: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博客

# #下拉框,快捷键,不能全局,改用键盘监听。
# 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)  # 事件

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.解决方法。

1.换用其他的类裤来实现键盘监听。

我也确实这样做了。不过发现效果不太理想。找不到一直监听的函数。

2.添加标识符。就算多次调用,只要我标识符没有改变他就不会进入处理函数。

这里我的处理方法是,用定时器。当调用这个函数的时候,触发定时器,三秒之后才才把标识符改变。这三秒内就算再次进入这个函数,也不会调用处理函数。

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()

定时器。


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

3.使用线程。

为什么要使用线程?某些函数执行的时间较长。如果放在主线程中就会导致程序画面卡死。因此要放在子线程中。

而此处的键盘监听函数是一直阻塞的,一直循环的,所以要放在线程中.

可参考的文章。

(54条消息) python:threading.Thread类的使用详解_啊啊啊西吧的博客-CSDN博客_python thread

(57条消息) python:threading.Thread类的使用详解_啊啊啊西吧的博客-CSDN博客_python thread

重写run

#监听键盘事件线程,暂时不用
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()

直接调用函数。

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()

八.程序的打包发布

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 ,无需下载极速在线查看,视频原画倍速播放。

阿里云盘分享 (aliyundrive.com)

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

Tmaof/python-_Code-highlighting: 可能会有同学使用word或者sdn来记笔记,在记笔记的过程中,难免少不了要敲代码。 这时候我们敲的代码不能高亮显示,就没有感觉,很头疼。 我也遇到了这样的问题,所以我想解决他。 最开始我是在网上搜可以代码高亮的网站: 代码在线高亮工具 | 将高亮美化的代码一键粘贴到 Word 或 OneNote 中 (highlightcode.com) 不过每次都这样把代码复制到网站上再粘贴下来很麻烦,能不能让它自动给我把代码复制下来,然后再传到网站上,再把网站上的内容给复制下来呢? 方法总归是有的. 我们可以通过Python实现模拟按键,ctrl加C,将文本复制到剪切板。再用Python将剪切板的内容给复制下来.然后用selenium库上传文本到网站上并读取高亮后的结果。最后再模拟模拟按键ctrl加V将高量后的代码粘贴到word中。 理论存在开始编写代码。 不过在编写代码之后,我们又会想到这样一个问题。每次上传到网站上再复制下来,都需要耗费几秒钟的时间。这个时间可能太长了,而且说不定哪一天这个网站它就关闭了。那能不能实现本地自己代码高亮呢? 经过查阅还真发现python提供了这样的代码高亮类库.pygments Pygments 文档 — Pygments 这个类库可以将代码高亮后生成各种格式的文件,我想到用它来生成html文件再用浏览器驱动自己打开并复制粘贴。 (github.com)

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.其他:

【TED演讲合集】_哔哩哔哩_bilibili

[B站首发] 经典影视学外语 (中英语言)练习口语和听力(有盲听部分)千寻_哔哩哔哩_bilibili

[B站首发] 经典影视学外语 (中英日三国语言)练习口语和听力(有盲听部分)(更新ing)5_哔哩哔哩_bilibili

六.后记(转载注明出处)

1.感谢:

谢谢各位大佬免费分享的各类编程知识!!!

2.小白刚上大一,经验也不是很足,文章中出错的,代码不好的...还请多多担待哈!

3.以前看别人写文章都说:码字不易.今天我是体会到了!

如果文章的某些部分对你有帮助,也请多多支持一下.只为了能帮到更多的人呀!

4.小白温馨提醒:各位要按时休息,吃饭呀.这几天写程序入迷了,熬夜,不按时吃饭,搞的身体很难受...这样不行呀

5.谢谢观看!

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值