在我们开始之前,来表明一下为什么人们不想用tkinter来构建Markdown编辑器。这是因为没有默认的简朴要领来显示markdown输入的html数据。甚至没有一个默认的tkinter组件来显示html数据。您可以简朴地编写/编辑markdown,可是没有简朴的要领在应用措施中显示输出。
可是,此刻有了tk_html_widgets,它可以辅佐我们显示html输出。
但它虽然也有一些问题:字体太小,不支持附加长途照片。
此刻让我们能开始构建吧。
开始构建:
首先,请确保您已安装Python 3和Tkinter。 假如没有,您可以从这里下载:
python.org/downloads(Tkinter已包括Python中)。
我们需要的其他对象是tkhtmlview和markdown2。 您可以通过运行pip install tkhtmlview markdown2或pip3 install tkhtmlview markdown2来安装它们(假如您有多个Python版本)。
此刻启动您喜欢的编辑器或IDE并建设一个新文件(譬喻(我将其定名为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),这汇报我们框架是可扩展的。简而言之,无论我们如何拉伸窗口巨细或最大化窗口巨细,框架都将填充窗口。
此刻,假如您运行剧本,您将看不到任何内容,因为我们仅界说了该类,但从未挪用过它。
为了办理这个问题,我们将以下代码放在剧本的末端:
root = Tk()
root.geometry("800x600")
app = Window(root)
app.mainloop()
接下来,将窗口的几许形状配置为800x600的长方体,800是窗口的高度,600是窗口的宽度。 在下一行中,您可以看到我们正在建设一个Window工具。 我们将root变量推入框架的root,并将其存储在名为app的变量中。
接下来要做的就是挪用mainloop函数,该函数汇报我们的应用措施运行!
此刻运行剧本。 假如正确完成所有操纵,您将看到一个空缺窗口,如下所示:
但这只是一个空缺窗口。 要在窗口中写入内容,我们需要添加一个文本字段,在个中写入我们的markdown。 为此,我们将利用tkinter中的Text小部件。
...
def init_window(self):
self.master.title("linuxidc.com编辑器")
self.pack(fill=BOTH, expand=1)
self.inputeditor = Text(self,)
self.inputeditor.pack(fill=BOTH, expand=1, side=LEFT)
不要与...夹杂(三个点),我把它们放在哪里只是为了暗示在此代码块之前有多行代码。