본문 바로가기
GUI 튜토리얼/tkinter 한꼬집씩만 따라해보기

21. 스크롤바 기본제공 텍스트 위젯 - Scrolledtext

by 일코 2022. 11. 18.

지난 포스팅

2022.11.18 - [기타/tkinter 한꼬집씩만 따라해보기] - 20. 텍스트박스 만들기

 

20. 텍스트박스 만들기

지난 포스팅 2022.11.18 - [기타/tkinter 한꼬집씩만 따라해보기] - 19. 라디오버튼 선택에 따라 작동하는 함수 추가하기 19. 라디오버튼 선택에 따라 작동하는 함수 추가하기 지난 포스팅 2022.11.17 - [기

martinii.fun


 

이번 포스팅에서는 : Scrolledtext 위젯 만들기

지난 포스팅에서는 텍스트위젯을 만들어보았고, 직접 Scrollbar 위젯을 우측에 붙이는 작업도 해보았습니다.

그런데 기본적으로 텍스트위젯이라면 텍스트 라인수가 길어졌을 때 스크롤바가 생기는 게 당연하기 때문에

편의상 스크롤바를 기본제공하는 텍스트위젯도 제공하고 있습니다.

이번 포스팅에서는 이 Scrolledtext 위젯에 대해 짧게 다뤄보겠습니다.

import tkinter as tk
from tkinter.scrolledtext import ScrolledText

win = tk.Tk()

text = ScrolledText(win, width=50, height=5)
text.grid(row=0, column=0)
text.focus()

win.mainloop()

 

코드는 간단합니다.  tk.Text 클래스 대신에 tk.scrolledtext.ScrolledText 를 사용한 것 밖에 차이가 없습니다.

사용법도 동일하고요.

참고로 text.focus() 메서드를 추가해놓았는데,
여러분도 꼭 여러분의 위젯 내에서 한 개의 입력창에 focus를 두는 것을 습관화 해 두시면 좋겠습니다.
비록 미묘한 차이지만, 값을 입력하기 위해 마우스로 클릭하는 게 생각보다 많이 귀찮은 일이긴 합니다.

 

실행해보면

의도한 대로 scrolledtext 위젯이 잘 실행되네요.

이대로 텍스트위젯을 마치기엔 아까울 만큼
텍스트위젯에서 제공하는 기능이 굉장히 많습니다.
기회가 되면 텍스트위젯에 대해 자세히 다루고 싶지만,
이미 파이썬 자체에도 문자열 메서드가 워낙 잘 만들어져 있고,
tkinter의 텍스트위젯을 에디터로 사용하기에는 비주얼이나 속도 면에서 다소 떨어지기 때문에,
텍스트 위젯을 텍스트 입력 용도 이상으로 활용하시는 것을 별로 추천하지는 않습니다.
그래도 텍스트 관련 원하는 거의 모든 기능을 수행할 수 있는 다양한 메서드는 여전히 매력적입니다.

 

부록 : 검색어 하이라이팅

아래는 tkinter 텍스트위젯 심화과정의 "투두리스트"와도 같은, 검색 프로그램입니다.

텍스트위젯의 메서드는 설명하지 않았지만 크게 복잡하지는 않습니다.

그 외 명령어들은 대부분 이 튜토리얼 시리즈에서 한 번씩은 다뤘던 것들입니다.

코드가 다소 깁니다. 안 읽고 넘어가셔도 괜찮습니다.
기왕 읽으실 거라면, 라인별로 의미를 한 번씩 리마인드 해보시기를 바랍니다.
기존에 설명이 미흡했던 부분을 포함해 간략한 주석을 추가해 두었습니다.
참고하시기 바랍니다.
더보기
import tkinter as tk
from tkinter.scrolledtext import ScrolledText
from tkinter import ttk


def find(*args):  # bind 메서드에 사용할 때에는 꼭 *args를 넘겨주어야 함
    text.tag_remove('found', '1.0', tk.END)  # 기존 found태그 전부 삭제
    search1 = entry.get()  # 새로 입력된 검색어 추출
    count = 0  # 검색결과 카운트 변수
    if search1:  # 검색어가 입력되었으면
        id_ = '1.0'  # id_의 초깃값을 1.0으로(시작인덱스)
        while True:
            id_ = text.search(search1, id_, nocase=1, stopindex=tk.END)
            if not id_:
                break
            lastid = f'{id_}+{len(search1)}c'  # 시작인덱스 + 글자수를더한인덱스
            text.tag_add('found', id_, lastid)  # 태그리스트에 추가
            id_ = lastid  # 검색결과 마지막 글자에서부터 재시작
            count += 1  # 검색결과 카운트 + 1
    text.tag_config('found', foreground='red', background="yellow")  # 태그구간 색 변경
    count_label.configure(text=f"{count}개 검색됨")  # 검색결과 수 레이블에 출력


win = tk.Tk()
win.title("검색어 하이라이팅")

ttk.Label(win, text='검색어를 입력하세요').grid(row=0, column=0)

entry = ttk.Entry(win)
entry.grid(row=0, column=1)
entry.bind("<KeyRelease>", find)  # 아무 키나 입력되면 find 재실행
entry.focus()  # 커서를 entry에 두기(focus)

button = ttk.Button(win, text='검색')
button.grid(row=0, column=2)
button.config(command=find)

count_label = ttk.Label(win, text="")
count_label.grid(row=0, column=3)

text = ScrolledText(win, wrap="word")  # 줄 끝에서 단어 단위로 줄넘김
text.insert('1.0', "tkinter pyqt pyside kivy PySimpleGUI WxPython PyGObject Remi " * 30)
text.grid(row=1, column=0, columnspan=4, padx=5, pady=5, ipadx=5, ipady=5)

win.mainloop()

실행해보면

 


다음 포스팅

2022.11.20 - [기타/tkinter 한꼬집씩만 따라해보기] - 22. 프레임 위젯 - 위젯들을 묶어주는 위젯

 

22. 프레임 위젯 - 위젯들을 묶어주는 위젯

지난 포스팅 2022.11.18 - [기타/tkinter 한꼬집씩만 따라해보기] - 21. 스크롤바 기본제공 텍스트 위젯 - Scrolledtext 21. 스크롤바 기본제공 텍스트 위젯 - Scrolledtext 지난 포스팅 2022.11.18 - [기타/tkinter 한

martinii.fun

 

댓글