tkinter显示rtf文件

  • 引言
    • 容我赞扬一番
  • 创建类
  • 匹配Frame父组件大小
  • 打开文件中的超链接
  • 载入rtf文件
  • 完整代码
  • 效果
  • 偷懒
  • 结语

引言

rtf文件是最经典的富文本格式文件,可以显示丰富的文本内容,同时还可以附带多种图片、附件以及加载项。虽然rtf相比于HTML和docx等文件并不是很有竞争力,但是因为其编辑方便,显示样式足够丰富,常被用于显示用户条例、软件文档、特殊输出信息显示等方面。

所以,在tkinter应用中显示*.rtf文件,我认为很有必要。

但是,tkinter无论从顶层还是底层来看,都没有办法显示*.rtf富文本格式的功能。但是,参照隔壁的WinForms,我们或许可以嵌入一个RichTextBox

容我赞扬一番

Python的一个第三方库:pythonnet是真的香,其也被引用为clr,可以调用Windows SDK。

所以无论是图像处理、GUI控件和线程等,均可以使用Windows提供的API。

我们需要使用pythonnet,使用pip下载安装,而且clr.pyd体积很小。


创建类

先引用一波。

from tkinter import Tk,Frame
from webbrowser import open as webopen
import ctypes
user32=ctypes.windll.user32import clr
clr.AddReference('System.Windows.Forms')
clr.AddReference('System.Drawing')
clr.AddReference('System')
from System.Windows.Forms import RichTextBox
from System.Drawing import Font
from System import String,Single

这个很简单了(在这个专栏里,我们已经创建超多自定义控件类了)。

class TkRichtext(Frame):'''显示*.rtf文件的tkinter富文本组件'''def __init__(self,master,width,height):Frame.__init__(self,master,width=width,height=height)font=Font(String('微软雅黑'),Single(13))self.rt=RichTextBox()self.rt.Font=fontself.rthwnd=int(str(self.rt.Handle))user32.SetParent(self.rthwnd,self.winfo_id())user32.MoveWindow(self.rthwnd,0,0,width,height,True)

匹配Frame父组件大小

为了让它看起来更像是一个tkinter控件,我们需要为其自动适配大小。

class TkRichtext(Frame):'''显示*.rtf文件的tkinter富文本组件'''def __init__(self,master,width,height):#...self.bind('<Configure>',self.__resize)def __resize(self,event):self.rt.Width=self.winfo_width()self.rt.Height=self.winfo_height()

打开文件中的超链接

其实我们发现,原来富文本框的超链接点击仅仅是一个空事件,需要我们自己绑定对超链接点击的处理方法。这里,我们直接使用浏览器打开。

class TkRichtext(Frame):'''显示*.rtf文件的tkinter富文本组件'''def __init__(self,master,width,height):#...self.__bind_event()def __bind_event(self):self.rt.LinkClicked+=self.__openlinkdef __openlink(self,sender,e):#点击链接webopen(e.LinkText)

这里之所以使用__bind_event来统一管理事件绑定,就是因为我还没来得及深入查看该组件的所有方法和事件,所以预留这一种途径。

载入rtf文件

因为目前我还没有深入了解这个WinForms组件,因此我只能给出这一个本地化函数了。

def loadfile(self,path):#载入*.rtf文件self.rt.LoadFile(path)

完整代码

from tkinter import Tk,Frame
from webbrowser import open as webopen
import ctypes
user32=ctypes.windll.user32import clr
clr.AddReference('System.Windows.Forms')
clr.AddReference('System.Drawing')
clr.AddReference('System')
from System.Windows.Forms import RichTextBox
from System.Drawing import Font
from System import String,Singleclass TkRichtext(Frame):'''显示*.rtf文件的tkinter富文本组件'''def __init__(self,master,width,height):Frame.__init__(self,master,width=width,height=height)font=Font(String('微软雅黑'),Single(13))self.rt=RichTextBox()self.rt.Font=fontself.rthwnd=int(str(self.rt.Handle))user32.SetParent(self.rthwnd,self.winfo_id())user32.MoveWindow(self.rthwnd,0,0,width,height,True)self.bind('<Configure>',self.__resize)self.__bind_event()def __bind_event(self):self.rt.LinkClicked+=self.__openlinkdef __openlink(self,sender,e):#点击链接webopen(e.LinkText)def __resize(self,event):self.rt.Width=self.winfo_width()self.rt.Height=self.winfo_height()def loadfile(self,path):#载入*.rtf文件self.rt.LoadFile(path)def test():a=Tk()a.geometry('600x600+5+5')rt=TkRichtext(a,500,500)rt.pack(fill='both',expand='True')rt.loadfile(r"E:\Py软件\Tin文件\软件说明.rtf")#这是我自己的文件,大家以自己的测试文件的路径为准a.mainloop()if __name__=='__main__':test()

效果

偷懒

当然,这个模块已经上传至PYPI了,你们可以通过pip安装tkrichtext库。


结语

事实上,我发现结合Windows SDK,tkinter会有非常多的新玩法,大家可以尽情尝试和探索!

☀tkinter创新☀

tkinter显示rtf文件相关推荐

  1. php操作rtf,是否可以使用PHP在网页内显示RTF文件? - php

    在将标签替换为用户输入后,我有一个RTF文件,希望在网页内显示. 我希望能够显示RTF文件,而不必在显示之前将其转换为某些内容. 现在,每次我尝试使用它时,都会弹出一个打开/保存框,即使我告诉它以以下 ...

  2. python读取摄像头或者视频文件、并在gui中实时显示_python:tkinter显示来自网络摄像头的视频并执行QR扫描...

    我一直在尝试创建一个tkinter顶级窗口,用于流式传输视频表单摄像头并执行QR扫描.我从SO和another code得到这个QR扫描代码,它只是从网络摄像头更新图像,而不是在tkinter标签上流 ...

  3. html file 隐藏,input type=file /浏览时只显示指定文件类型(html5新特性)

    type="file" />浏览时只显示指定文件类型 accept属性列表 1.accept="application/msexcel" 2.accept ...

  4. php只显示指定文件类型_PHP 上传时的文件类型

    php上传常见文件类型对应的$_FILES["file"]["type"]. xls application/vnd.ms-excel xlsx applica ...

  5. 日常学习记录——tkinter显示excel表格中的数据

    1 场景需求 点击西瓜数据按钮新建一个窗口,该窗口默认读取程序设定好的数据文件,并显示在创建好的表格控件中,如果需要导入新的文件可以通过更改文件按钮进行更改,点击显示按钮会将原来表格控件中的数据清除, ...

  6. python读取rtf文件_【Python】【IO】文件读写

    一.打开的文件在使用完后要关闭 >>>f=file('fibs.py') #用''表示文件名 #无''表示变量名 >>>f.read() #打印fibs.py中的内 ...

  7. 显示所有文件和文件夹无论如何 无法被设置

    问题:XP系统选显示所有文件和文件夹确定后没有任何反应再次打开文件夹选项里面仍是不显示隐藏的文件和文件夹 答案:在记事本粘贴下面文字,另存为所有文件, .reg 格式.成功的话图标变为绿色碎方块.在双 ...

  8. linux tree命令 树结构显示目录文件

    命令简介 tree命令的中文意思为"树",功能是以树形结构列出指定目录下的所有内容,包括所有文件.子目录及子目录里的目录和文件. 命令格式 tree [option] [direc ...

  9. linux 如何显示一个文件的某几行(中间几行)

    linux 如何显示一个文件的某几行(中间几行) [一]从第3000行开始,显示1000行.即显示3000~3999行 cat filename | tail -n +3000 | head -n 1 ...

  10. Mac下如何显示隐藏文件/文件夹

    Mac下默认也是不显示隐藏文件的,有些时候我们想查看隐藏文件就不是那么方便了,下面我就给大家分享2种查看隐藏文件/文件夹的方法 工具/原料 Mac操作系统 Finder 终端 通过Finder 1 在 ...

最新文章

  1. 基于Co-Attention和Co-Excitation的少样本目标检测 | NeurIPS 2019
  2. c++ primer,友元函数上的一个例子(By Sybase)
  3. 函数 php_PHP函数缺陷详解
  4. 计算机的颜色储存格式(索引色 真彩色)
  5. 牛客题霸 [删除链表的倒数第n个节点] C++题解/答案
  6. ssm框架下 tiles框架 的使用
  7. Conditional project or library reference in Visual Studio
  8. Python Pytest装饰器@pytest.mark.parametrize详解
  9. JS 用JS实现跟随光标的提示
  10. oracle11g增加备库,oracle11g dataguard物理备库搭建(关闭主库cp数据文件到备库)
  11. Noip2013花匠
  12. 杭电多校第一场补题-1002 Balanced Sequence
  13. 五句话介绍计算机英语,用英语描写电脑优点(5个句子)和缺点(5个句子),一共10句话哦....
  14. 2021爱分析・区域性银行数字化实践报告
  15. 【023】翼辉信息于南京召开国产嵌入式信息产业前沿技术交流会暨SylixOS新版发布会
  16. Python 写入txt文本文件
  17. centos上升级node_如何升级nodejs到最新版本
  18. 我理解的myisam引擎之二 MyISAM表(MYD)存储格式
  19. 纯js版本网页连连看原理分析和实现
  20. elasticsearch的基础使用(二)

热门文章

  1. DM9000有线网卡驱动编写
  2. 开始使用Mac OS X——致Mac新人
  3. U盘启动 WinPE系统维护工具 任意安装GHO/WIM/ESD系统映像 无广告专业版
  4. Windows系统electron集成flash播放器(.swf文件在electron中Vue页面中播放)
  5. arduino环境下用ESP32连接PS2手柄
  6. C++描述 LeetCode 480. 滑动窗口中位数
  7. [GOM引擎]假人配置的脚本设置方法
  8. 基于MATLAB的温度报警,基于Matlab的小型温度检测系统设计
  9. Top 10 JavaScript编辑器,你在用哪个?
  10. 白菜cms双端影视APP源码