利用Python和Tkinter构建简朴的Markdown编辑器(2)

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

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

运行剧本时,您会看到“Multiline Input Field”已经受了整个“窗口”。 假如您开始写它,您大概会留意到字符太小了。

利用Python和Tkinter构建简朴的Markdown编辑器

我已经知道会呈现这个问题。 这就是为什么我之前汇报过您建设自界说字体工具(self.myfont)的原因。 此刻,假如您执行以下操纵:

self.inputeditor = Text(self, , font=self.myfont)

(这里,我们汇报Text小部件利用自界说字体,而不是默认的小字体!)

...输入字段的字体巨细将增加到15。运行剧本以查抄是否一切正常。

利用Python和Tkinter构建简朴的Markdown编辑器

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

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

self.outputbox = HTMLLabel(self,, background="white", html="<h1>linuxidc.com</h1>")
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和Tkinter构建简朴的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工具。最后一行(上面标红那行),首先我们…等等!最后一行大概会让一些读者感想狐疑。我把它分成三行。

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编辑器。当您输入输入字段时,输出也将被更新。

可是…我们的事情还没有完成。用户至少需要可以或许打开和生存他们的文本。

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

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

简朴说一下:

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

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsdjxz.html