在这里,我们建设了一个宽度为1的Text小部件。不要误会,觉得错了-这里的巨细是利用比例来完成的。 当我们将其放入输出框中时,您将在接下来的几秒钟内更清楚地相识它。
然后,我们将其包装到框架中,并使其在程度和垂直偏向上均可拉伸。
运行剧本时,您会看到“Multiline Input Field”已经受了整个“窗口”。 假如您开始写它,您大概会留意到字符太小了。
我已经知道会呈现这个问题。 这就是为什么我之前汇报过您建设自界说字体工具(self.myfont)的原因。 此刻,假如您执行以下操纵:
self.inputeditor = Text(self, , font=self.myfont)
(这里,我们汇报Text小部件利用自界说字体,而不是默认的小字体!)
...输入字段的字体巨细将增加到15。运行剧本以查抄是否一切正常。
此刻,我认为是时候添加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()使文本适合小部件。
此刻运行代码,如下所示:
此刻,假如您开始在输入字段中书写,输入时输出不会获得更新。 那是因为我们还没有汇报我们的措施这样做。
为此,我们首先要与编辑器绑定一个事件。 然后,你举办修改文本,输出城市获得更新,如下所示:
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)
简朴说一下:
在这里,我们界说了一个新菜单,框架作为它的父菜单。
接下来,我们界说另一个菜单和上一个菜单作为其父菜单。它将作为我们的文件菜单。