Ответы пользователя по тегу Tkinter
  • Как поместиь виджеты в фрейм (tkinter)?

    @kamenyuga
    Не получается разместить виджеты в фрейм

    В приведенном коде f1 - это результат вызова метода pack(), который НЕ возвращает ссылку на фрэйм, а возвращает None. Это базовый синтаксис питона, переменной присваивается результат вызова функции.

    Не могу задать высоту и ширину фрейма

    Документация tk говорит, что "If you want to force the frame to have a specific width, call the .grid_propagate(0) on the widget". По дефолту ткинтер задает всем элементам минимальный требуемый размер, чтобы все поместилось, либо растягивает от минимального размера до размера окна, если указать, как растягивать. Ну, а если места не хватает, то начинаются сжатие, обрезка, невлезание в окно и т.д. В принципе, стандартное поведение многих десктопных гуишек.

    Для сколько-нибудь сложного гуи в ткинтере лучше, конечно, использовать .grid(...) - больше строк кода, но более гибкий и контролируемый результат. Грид - это сетка, у нее есть параметр минимального размера строки/столбца.

    import * - это плохо.
    Ответ написан
    Комментировать
  • Можно ли в Text выделять какие то слова? Если да, то как?

    @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. Выделение происходит навсегда - здесь нет очистки выделения. Выделение - по отпусканию левой кнопки мыши на самом виджете. Ну, и, конечно, говнокодец - лишь бы заработало.
    Ответ написан