iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python中怎么构建一个Markdown编辑器
  • 122
分享到

Python中怎么构建一个Markdown编辑器

2023-06-16 13:06:53 122人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章给大家介绍python中怎么构建一个markdown编辑器,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。首先,请确保您已安装Python 3和Tkinter。如果没有,您可以从这里下载:python.org/d

这篇文章给大家介绍python中怎么构建一个markdown编辑器,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

首先,请确保您已安装Python 3和Tkinter。如果没有,您可以从这里下载:

python.org/downloads(Tkinter已包含Python中)。

我们需要的其他东西是tkhtmlview和markdown2。您可以通过运行pip install tkhtmlview markdown2或pip3 install tkhtmlview markdown2来安装它们(如果您有多个Python版本)。

现在启动您喜欢的编辑器或IDE并创建一个新文件(例如www.linuxidc.com.py(我将其命名为linuxidc.com编辑器))。

我们将从导入必要的库开始。

from tkinter import *  from tkinter import font , filedialog  from markdown2 import Markdown  from tkhtmlview import HTMLLabel

在第一行中,我们从tkinter包中导入(几乎)所有内容。

在第二行中,我们导入字体和文件对话框。需要使用font来设置输入字段的样式(例如Font,Font Size),并导入filedialog以打开markdown文件以进行编辑(和/或保存我们的markdown文件)。

在第三行中,导入了Markdown,以帮助我们将Markdown源转换为html,并使用HTMLLabel(在第四行中导入)将其显示在输出字段中。

之后,我们将创建一个名为Window的框架类,该框架类将从tkinters的Frame类继承。它将保存我们的输入和输出字段。

class Window(Frame):      def __init__(self, master=None):          Frame.__init__(self, master)          self.master = master          self.myfont = font.Font(family="Helvetica", size=14)          self.init_window()      def init_window(self):          self.master.title("linuxidc.com编辑器")          self.pack(fill=BOTH, expand=1)

在此代码块中,我们首先定义一个称为Window的类,该类继承tkinter的Frame小部件类。

现在,在初始化函数中,我们将master作为参数,用作框架的父级。在下一行中,我们初始化一个Frame。

接下来,我们声明一个名为self.myfont的自定义字体对象,其字体家族为Helvetica(您可以选择任何字体家族),大小为15,将在我们的markdown输入字段中使用。

最后,我们调用init_window函数,将我们的应用程序置于核心位置。

在init_window函数中,我们首先将窗口的标题设置为linuxidc.com编辑器。在下一行self.pack(fill=BOTH, expand=1)中,我们告诉Frame占用窗口的全部空间。

我们将fill关键字参数设置为BOTH,这实际上是从tkinter库导入的。它告诉框架在水平和垂直方向上都填充窗口,并且expand关键字参数设置为1(表示True),这告诉我们框架是可扩展的。简而言之,无论我们如何拉伸窗口大小或最大化窗口大小,框架都将填充窗口。

现在,如果您运行www.linuxidc.com.py脚本,您将看不到任何内容,因为我们仅定义了该类,但从未调用过它。

为了解决这个问题,我们将以下代码放在脚本的末尾:

root = Tk()  root.geometry("800x600")  app = Window(root)  app.mainloop()

接下来,将窗口的几何形状设置为800x600的长方体,800是窗口的高度,600是窗口的宽度。在下一行中,您可以看到我们正在创建一个Window对象。我们将root变量推入框架的root,并将其存储在名为app的变量中。

接下来要做的就是调用mainloop函数,该函数告诉我们的应用程序运行!

现在运行www.linuxidc.com.py脚本。如果正确完成所有操作,您将看到一个空白窗口,如下所示:

Python中怎么构建一个Markdown编辑器

但这只是一个空白窗口。要在窗口中写入内容,我们需要添加一个文本字段,在其中写入我们的markdown。为此,我们将使用tkinter中的Text小部件。

...  def init_window(self):      self.master.title("linuxidc.com编辑器")      self.pack(fill=BOTH, expand=1)      self.inputeditor = Text(self, width="1")      self.inputeditor.pack(fill=BOTH, expand=1, side=LEFT)

不要与...混淆(三个点),我把它们放在那里只是为了表示在此代码块之前有多行代码。

在这里,我们创建了一个宽度为1的Text小部件。不要误会,以为错了-这里的大小是使用比例来完成的。当我们将其放入输出框中时,您将在接下来的几秒钟内更清楚地了解它。

然后,我们将其包装到框架中,并使其在水平和垂直方向上均可拉伸。

运行脚本时,您会看到已接管了整个“窗口”。如果您开始写它,您可能会注意到字符太小了。

Python中怎么构建一个Markdown编辑器

我已经知道会出现这个问题。这就是为什么我之前告诉过您创建自定义字体对象(self.myfont)的原因。现在,如果您执行以下操作:

self.inputeditor = Text(self, width="1" , font=self.myfont)

(这里,我们告诉Text小部件使用自定义字体,而不是默认的小字体!)

...输入字段的字体大小将增加到15。运行脚本以检查是否一切正常。

Python中怎么构建一个Markdown编辑器

现在,我认为是时候添加outputbox了,我们在编写时将看到markdown源代码的html输出。

为此,我们要添加一个HTMLLabel,在init_window函数中是这样的:

self.outputbox = HTMLLabel(self, width="1", background="white", html="<h2>linuxidc.com</h2>")  self.outputbox.pack(fill=BOTH, expand=1, side=RIGHT)  self.outputbox.fit_height()

我们使用tkhtmlview中的HTMLLabel,宽度仍旧为1。我们将宽度设置为1,因为窗口将在输入字段和输出框之间以1:1的比例共享(运行脚本时您会明白我的意思)。

html关键字参数存储将在第一次显示的值。

然后,将其打包在窗口中,将side作为RIGHT置于输入字段的右侧。fit_height()使文本适合小部件。

现在运行代码,如下所示:

Python中怎么构建一个Markdown编辑器

现在,如果您开始在输入字段中书写,输入时输出不会得到更新。那是因为我们还没有告诉我们的程序这样做。

为此,我们首先要与编辑器绑定一个事件。然后,你进行修改文本,输出都会得到更新,如下所示:

self.inputeditor.bind("<<Modified>>", self.onInputChange)

将这一行放到init_window()函数中。

这一行告诉inputeditor在文本改变时调用onInputChange函数。但是因为我们还没有那个函数,我们需要把它写出来。

...  def onInputChange(self , event):      self.inputeditor.edit_modified(0)      md2html = Markdown()      self.outputbox.set_html(md2html.convert(self.inputeditor.get("1.0" , END)))

在第一行中,我们使用edit_modified(0)重置修改后的标志,以便重用它。否则,在第一次事件调用之后,它将不再工作。

接下来,我们创建一个名为md2html的Markdown对象。最后一行(上面标红那行),首先我们&hellip;等等!最后一行可能会让一些读者感到困惑。我把它分成三行。

markdownText = self.inputeditor.get("1.0" , END)  html = md2html.convert(markdownText)  self.outputbox.set_html(html)

在第一行中,我们从输入字段的顶部到底部获取markdown文本。第一个参数,self.inputeditor.get,告诉它从第一行的第0个字符开始扫描(1.0 => [LINE_NUMBER].[CHARACTER_NUMBER]),最后一个参数告诉它在到达末尾时停止扫描。

然后,我们使用md2html.convert()函数将扫描的markdown文本转换为html,并将其存储在html变量中。

最后,我们告诉outputbox使用.set_html()函数来显示输出!

运行脚本。您将看到一个功能几乎正常的markdown编辑器。当您输入输入字段时,输出也将被更新。

但是&hellip;我们的工作还没有完成。用户至少需要能够打开和保存他们的文本。

为此,我们要在菜单栏中添加一个文件菜单。在这里,用户可以打开和保存文件,也可以退出应用程序。

在init_window函数中,我们将添加以下行:

self.mainmenu = Menu(self)  self.filemenu = Menu(self.mainmenu)  self.filemenu.add_command(label="打开", command=self.openfile)  self.filemenu.add_command(label="另存为", command=self.savefile)  self.filemenu.add_separator()  self.filemenu.add_command(label="退出", command=self.quit)  self.mainmenu.add_cascade(label="文件", menu=self.filemenu)  self.master.config(menu=self.mainmenu)

简单说一下:

在这里,我们定义了一个新菜单,框架作为它的父菜单。

接下来,我们定义另一个菜单和上一个菜单作为其父菜单。它将作为我们的文件菜单。

然后使用add_command()和add_separator()函数添加3个子菜单(打开、另存为和退出)和分隔符。打开子菜单将执行openfile函数,另存为子菜单将执行savefile函数。最后,Exit将执行一个内建函数quit,该函数将关闭程序。

然后使用add_cascade()函数告诉第一个菜单对象包含filemenu变量。这包括标签文件中的所有子菜单。

最后,我们使用self.master.config()来告诉窗口使用主菜单作为窗口的菜单栏。

Python中怎么构建一个Markdown编辑器

它看起来是这样的,但是现在还不要运行它。你会提示错误,openfile和savefile函数没有定义。

正如您现在看到的,我们必须在Window类中定义两个函数,我们将在其中使用tkinter的filedialog。

首先让我们定义打开文件的函数:

def openfile(self):      openfilename = filedialog.askopenfilename(filetypes=(("Markdown File", "*.md , *.mdown , *.markdown"),                                                                    ("Text File", "*.txt"),                                                                    ("All Files", "*.*")))      if openfilename:          try:              self.inputeditor.delete(1.0, END)              self.inputeditor.insert(END , open(openfilename).read())          except:              print("无法打开文件!")

在这里,首先我们向用户显示一个文件浏览器对话框,允许他们使用filedialog.askopenfilename()选择要打开的文件。与filetypes关键字参数,我们告诉对话框只打开这些类型的文件通过传递一个元组与支持的文件(基本上所有类型的文件):

  •  带 .md , .mdown , .markdown扩展名的文件

  •  扩展名为.txt的文本文件

  •  在使用通配符扩展的下一行中,我们告诉对话框打开任何扩展名的文件。

然后我们检查用户是否选择了一个文件。如果是,我们尝试打开文件。然后删除输入字段中从第一行的第0个字符到字段末尾的所有文本。

接下来,我们打开并读取所选文件的内容,并在输入字段中插入内容。

如果我们的程序不能打开一个文件,它将打印出错误。但是等等,这不是处理错误的好方法。我们在这里可以做的是向用户显示一个类似这样的错误消息:

Python中怎么构建一个Markdown编辑器

为此,我们首先要从tkinter包中导入消息框messagebox。

from tkinter import messagebox as mbox

然后,不像上面那样只是打印一个错误消息,我们将用下面的行替换那一行,以便向用户显示正确的错误消息。

mbox.showerror(“打开选定文件时出错 " , "哎呀!,您选择的文件:{}无法打开!".fORMat(openfilename))

这将创建一个错误消息,就像我上面显示的文件无法打开时的屏幕截图一样。

mbox.showerror函数,第一个参数是消息框的标题。第二个是要显示的消息。

现在,我们需要编写一个savefile函数来保存markdown输入。

def savefile(self):          filedata = self.inputeditor.get("1.0" , END)          savefilename = filedialog.asksaveasfilename(filetypes = (("Markdown File", "*.md"),                                                                    ("Text File", "*.txt")) , title="保存 Markdown 文件")          if savefilename:              try:                  f = open(savefilename , "w")                  f.write(filedata)              except:                  mbox.showerror("保存文件错误" , "哎呀!, 文件: {} 保存错误!".format(savefilename))

在这里,首先我们扫描输入字段的所有内容并将其存储在一个变量中。然后,我们通过为两种类型的文件类型(.md和.txt)。

如果用户选择一个文件名,我们将尝试保存存储在变量filedata中的输入字段的内容。如果发生异常,我们将向用户显示一条错误消息,说明程序无法保存文件。

关于Python中怎么构建一个Markdown编辑器就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: Python中怎么构建一个Markdown编辑器

本文链接: https://www.lsjlt.com/news/283804.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python中怎么构建一个Markdown编辑器
    这篇文章给大家介绍Python中怎么构建一个Markdown编辑器,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。首先,请确保您已安装Python 3和Tkinter。如果没有,您可以从这里下载:python.org/d...
    99+
    2023-06-16
  • 怎么在html中实现一个markdown编辑器效果
    今天就跟大家聊聊有关怎么在html中实现一个markdown编辑器效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一:下载Editor.md进入官网直接进行下载使用npm进行下载n...
    99+
    2023-06-09
  • 分享一个基于Ace的Markdown编辑器
    我认为的编辑器分成两类,一种是分为左右两边实现即时渲染;一种是先写语法,然后通过按钮实现渲染。 其实即时渲染也不难,共同需要考虑的问题就是xss,因为渲染库能自定义第三方的xss过滤...
    99+
    2024-04-02
  • 怎么使用基于Ace的Markdown编辑器
    本篇内容介绍了“怎么使用基于Ace的Markdown编辑器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!我认为的编辑器分成两类,一种是分为左...
    99+
    2023-06-25
  • 怎么构建一个Python包
    本篇内容主要讲解“怎么构建一个Python包”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么构建一个Python包”吧!开始首先,您肯定需要设置一个或多个内容,以便了解如何构建python包。...
    99+
    2023-06-16
  • Python中怎么构建一个决策树
    本篇文章给大家分享的是有关Python中怎么构建一个决策树,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。决策树决策树是当今最强大的监督学习方法的组成部分。决策树基本上是一个二叉...
    99+
    2023-06-16
  • Python中怎么构建一个FP-growth算法
    本篇文章为大家展示了Python中怎么构建一个FP-growth算法,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。FP算法发现频繁项集的过程是:(1)构建FP树;(2)从FP树中挖掘频繁项集FP表示...
    99+
    2023-06-17
  • Python怎么构建一个文档扫描器
    本篇内容主要讲解“Python怎么构建一个文档扫描器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python怎么构建一个文档扫描器”吧!准备好环境首先您应该熟悉Python的基础知识,还需要了...
    99+
    2023-07-05
  • 怎么用HTML+CSS做实时预览的markdown编辑器
    这篇文章主要讲解了“怎么用HTML+CSS做实时预览的markdown编辑器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用HTML+CSS做实时预览的...
    99+
    2024-04-02
  • virtualenvwrapper中怎么构建一个Python虚拟环境
    本篇文章给大家分享的是有关virtualenvwrapper中怎么构建一个Python虚拟环境,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Python 对管理虚拟环境的支持,...
    99+
    2023-06-15
  • Node.js中怎么构建一个API服务器
    这篇文章将为大家详细讲解有关Node.js中怎么构建一个API服务器,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。配置创建一个新目录,运行 npm init...
    99+
    2024-04-02
  • 怎么在java中创建一个构造器
    这篇文章将为大家详细讲解有关怎么在java中创建一个构造器,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;...
    99+
    2023-06-14
  • Python写一个简单的在线编辑器
    直接奔入主题看下面pywebio程序,实现了Python的简陋在线编辑器 from pywebio.input import * from pywebio.output import...
    99+
    2024-04-02
  • 如何正确选择一个Python编辑器
    本篇文章给大家分享的是有关如何正确选择一个Python编辑器,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。经过长时间学习Python编辑器,于是和大家分享一下,看完本文你肯定有...
    99+
    2023-06-17
  • Python中怎么构建一个极小的区块链
    今天就跟大家聊聊有关Python中怎么构建一个极小的区块链,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。区块链以比特币(Bitcoin)或其它加密货币按时间顺序公开地记录交易的数字账...
    99+
    2023-06-17
  • Python中怎么利用 FastAPI构建一个Web服务
    Python中怎么利用 FastAPI构建一个Web服务,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。起步我们将使用 Fedora 作为基础镜像来搭建开发环境,...
    99+
    2023-06-16
  • 怎么在python中利用Dockerfile构建一个镜像
    今天就跟大家聊聊有关怎么在python中利用Dockerfile构建一个镜像,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。python的数据类型有哪些python的数据类型:1. 数...
    99+
    2023-06-14
  • 怎么使用Vim编辑器编辑多个文件
    这篇文章主要介绍怎么使用Vim编辑器编辑多个文件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!安装 VimVim 编辑器可在大多数 Linux 发行版的官方软件仓库中找到,所以您可以用默认的软件包管理器来安装它。例如...
    99+
    2023-06-16
  • JavaScript中怎么构建一个倒数计时器
    JavaScript中怎么构建一个倒数计时器,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。首先,你需要设置一个有效的结束日期。这应该是Java...
    99+
    2024-04-02
  • 怎么使用Python构建一个仪表板
    本篇内容主要讲解“怎么使用Python构建一个仪表板”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Python构建一个仪表板”吧!简介如果你目前在一个数据或商业智能团队工作,你的任务之一...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作