Добавление расширенных функций в текстовый виджет tkinter
Я работаю над простой системой обмена сообщениями, и мне нужно добавить следующее в текстовый виджет Tkinter:
- Проверка орфографии
- Возможность изменить шрифт (на выделенном тексте)
- Возможность изменить цвет шрифта (для выделенного текста)
- Возможность изменить размер шрифта (для выделенного текста)
Я понимаю, что виджет tkinter Text имеет возможность использовать несколько шрифтов и цветов с помощью механизма тегов, но я не понимаю, как использовать эти возможности.
Как я могу реализовать эти функции, используя функции виджета Текст? В частности, как я могу изменить семейство шрифтов, цвет и размер слов и как я могу использовать это для реализации чего-то вроде проверки орфографии, где слова с ошибками подчеркнуты или окрашены не так, как остальная часть текста.
2 ответа
Текстовый виджет 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) Tk не имеет встроенной проверки орфографии. Вас может заинтересовать PyEnchant.
2) 3) 4) это не так сложно (пожалуйста, забудьте мое предыдущее предложение использовать wxPython). Вы можете передать tag_config как 3-й аргумент метода вставки текстового виджета. Это определяет конфигурацию этого выбора.
Посмотрите следующий код, который адаптирован из примера 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()