Можно ли в Text выделять какие то слова? Если да, то как?

Можно ли в Text выделять какие то слова? Допустим, есть gui программа на python и tkinter. И всегда, когда пользователь пишет "Привет", это слово выделяется желтым цветом. То-есть, все "Привет" в тексте должны выделяться желтым цветом.
Я смог понять, как можно сделать постоянную проверку на наличие этого:
1.
def checkSyntax():
    #тут будет находиться проверка и выполнение

2.
checkSyntax() # а это будет находиться перед root.mainloop()


Можно ли сделать такой эффект редактора, как в Sublime Text или Notepad++?
  • Вопрос задан
  • 494 просмотра
Решения вопроса 1
@kamenyuga
Вот, например, простой пример выделения цветом:
def __create_problem_description_frame(self):

	# здесь создаем сам виджет - self.problem_description_body
	# self - это tk.Frame

	# непосредственно вся логика
	def f1(_event):

		# ищем выделенный текст, но никак его не проверяем - одна буква или слово - без разницы
		if self.problem_description_body.tag_ranges(tk.SEL):
			print('SELECTED Text is %r' % self.problem_description_body.get(tk.SEL_FIRST, tk.SEL_LAST))
		else:
			print('NO Selected Text')
			return

		# в тексте ищем точные совпадения
		pattern = str(self.problem_description_body.get(tk.SEL_FIRST, tk.SEL_LAST))

		start = self.problem_description_body.index("1.0")
		end = self.problem_description_body.index("end")
		self.problem_description_body.mark_set("matchStart", start)
		self.problem_description_body.mark_set("matchEnd", start)
		self.problem_description_body.mark_set("searchLimit", end)

		# как будем выделять - название тэга и желтый фон
		self.problem_description_body.tag_configure("yellow", background="#ffff99")

		# погнали искать все совпадения
		count = tk.IntVar()
		while True:
			# непосредственно сам поиск
			index = self.problem_description_body.search(
				pattern, "matchEnd", "searchLimit", count=count, regexp=True)
			if index == "":
				break
			if count.get() == 0:
				break
			# и, наконец, выделение найденного фрагмента текста тэгом с именем yellow
			self.problem_description_body.mark_set("matchStart", index)
			self.problem_description_body.mark_set("matchEnd", "%s+%sc" % (index, count.get()))
			self.problem_description_body.tag_add("yellow", "matchStart", "matchEnd")
        
	# биндим срабатывание на отпускание кнопки мыши 
	self.problem_description_body.bind('<ButtonRelease-1>', f1)

Проверено, что работает в питоне 3.7. Выделение происходит навсегда - здесь нет очистки выделения. Выделение - по отпусканию левой кнопки мыши на самом виджете. Ну, и, конечно, говнокодец - лишь бы заработало.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы