我正在开发一个简单的消息传递系统,需要将以下内容添加到Tkinter文本小部件中:
据我所知,tkinter Text小部件可以通过标记机制使用多种字体和颜色,但我不明白如何使用这些功能。
如何使用Text小部件的功能实现这些功能?具体来说,我如何更改单词的字体系列,颜色和大小,以及如何使用它来实现拼写检查,拼写错误的单词加下划线或与文本的其他部分不同。
答案 0 :(得分:25)
Tkinter文本小部件功能非常强大,但您必须自己完成一些高级功能。它没有内置的拼写检查或内置按钮来加粗文本等,但它们很容易实现。小部件中有所有功能,您只需要知道如何操作。
以下示例为您提供了一个按钮,用于切换突出显示文本的粗体状态 - 选择一系列字符,然后单击要添加的按钮,然后删除粗体属性。你应该很容易扩展这个字体和颜色的例子。
拼写检查也很简单。下面的例子使用/ usr / share / dict / words中的单词(几乎可以肯定在Windows 7上不存在,因此你需要提供一个合适的单词列表)它相当简单,只有拼写检查当您按空格键时,但这只是为了将示例的代码大小保持在最低水平。在现实世界中,当你进行拼写检查时,你会想要更加聪明一些。
import Tkinter as tk
import tkFont
class App(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
## Toolbar
self.toolbar = tk.Frame()
self.bold = tk.Button(name="toolbar", text="bold",
borderwidth=1, command=self.OnBold,)
self.bold.pack(in_=self.toolbar, side="left")
## Main part of the GUI
# I'll use a frame to contain the widget and
# scrollbar; it looks a little nicer that way...
text_frame = tk.Frame(borderwidth=1, relief="sunken")
self.text = tk.Text(wrap="word", background="white",
borderwidth=0, highlightthickness=0)
self.vsb = tk.Scrollbar(orient="vertical", borderwidth=1,
command=self.text.yview)
self.text.configure(yscrollcommand=self.vsb.set)
self.vsb.pack(in_=text_frame,side="right", fill="y", expand=False)
self.text.pack(in_=text_frame, side="left", fill="both", expand=True)
self.toolbar.pack(side="top", fill="x")
text_frame.pack(side="bottom", fill="both", expand=True)
# clone the text widget font and use it as a basis for some
# tags
bold_font = tkFont.Font(self.text, self.text.cget("font"))
bold_font.configure(weight="bold")
self.text.tag_configure("bold", font=bold_font)
self.text.tag_configure("misspelled", foreground="red", underline=True)
# set up a binding to do simple spell check. This merely
# checks the previous word when you type a space. For production
# use you'll need to be a bit more intelligent about when
# to do it.
self.text.bind("<space>", self.Spellcheck)
# initialize the spell checking dictionary. YMMV.
self._words=open("/usr/share/dict/words").read().split("\n")
def Spellcheck(self, event):
'''Spellcheck the word preceeding the insertion point'''
index = self.text.search(r'\s', "insert", backwards=True, regexp=True)
if index == "":
index ="1.0"
else:
index = self.text.index("%s+1c" % index)
word = self.text.get(index, "insert")
if word in self._words:
self.text.tag_remove("misspelled", index, "%s+%dc" % (index, len(word)))
else:
self.text.tag_add("misspelled", index, "%s+%dc" % (index, len(word)))
def OnBold(self):
'''Toggle the bold state of the selected text'''
# toggle the bold state based on the first character
# in the selected range. If bold, unbold it. If not
# bold, bold it.
current_tags = self.text.tag_names("sel.first")
if "bold" in current_tags:
# first char is bold, so unbold the range
self.text.tag_remove("bold", "sel.first", "sel.last")
else:
# first char is normal, so bold the whole selection
self.text.tag_add("bold", "sel.first", "sel.last")
if __name__ == "__main__":
app=App()
app.mainloop()
答案 1 :(得分:4)
1)Tk没有集成的拼写检查程序。您可能对PyEnchant感兴趣。
2)3)4)并不困难(请忘记我之前使用wxPython的建议)。您可以将tag_config作为文本小部件的insert方法的第3个arg传递。它定义了这个选择的配置。
请参阅以下代码,该代码改编自Scrolledtext示例和effbot,其中有关Tk的最佳参考。
"""
Some text
hello
"""
from Tkinter import *
from Tkconstants import RIGHT, LEFT, Y, BOTH
from tkFont import Font
from ScrolledText import ScrolledText
def example():
import __main__
from Tkconstants import END
stext = ScrolledText(bg='white', height=10)
stext.insert(END, __main__.__doc__)
f = Font(family="times", size=30, weight="bold")
stext.tag_config("font", font=f)
stext.insert(END, "Hello", "font")
stext.pack(fill=BOTH, side=LEFT, expand=True)
stext.focus_set()
stext.mainloop()
if __name__ == "__main__":
example()