2023年7月6日 星期四

Python 學習筆記 : 如何在 tkinter 的 Text 元件中搜尋字串並以高亮度顯示

這也是最近用 Tkinter 寫維運自動化軟體的總結經驗之一, 在此軟體的記錄檔管理功能中, 可以讓使用者輸入想要搜尋的字串, 然後在文字區域元件 Text 中用高亮度來標示該字串於文本中出現的地方. 以下用簡化的範例來說明作法.

下面的範例程式中, 使用簡單的 pack 排版方式放置一個 Entry 輸入框, Button 按鈕, 以及 Text 多行文字輸入框, 當按下按鈕時呼叫 search_text() 函式於 Text 元件的內容中做全文搜索, 利用索引逐步推進法找尋 Entry 輸入框中指定之字串直到文本末端, 當找到文本時就設定為高亮度顯示, 程式如下 :

import tkinter as tk
from tkinter import ttk

root=tk.Tk()  
root.title('搜尋文本高亮度顯示測試') 
root.geometry('400x300') 

def search_text():
    search_what=search_what_var.get()  # 取得搜尋標的
    text.tag_remove('highlight', '1.0', tk.END)  # 移除全部高亮度顯示標籤
    start='1.0'  # 預設起始索引為文本開頭
    while True:  # 搜尋全部文本直到末端
        start=text.search(search_what, start, stopindex=tk.END)
        if not start:  # 起始索引為 0 : 已到末端結束搜尋
            break
        end=f'{start}+{len(search_what)}c'  # 末端字串
        text.tag_add('highlight', start, end)  # 將搜尋到的字串設為高亮度
        start=end  # 後軍當前軍, 移動開始索引到目前標的尾端
        
search_what_var=tk.StringVar()   # 綁定 Entry 元件的字串變數
search_entry=tk.Entry(root, textvariable=search_what_var) 
search_entry.pack()
search_btn=ttk.Button(root, text='搜尋', command=search_text)
search_btn.pack()
text=tk.Text(root)
text.pack(fill=tk.BOTH, expand=True)
text.tag_configure('highlight', background='yellow')  # 設定 Text 高亮度為黃色
root.mainloop()

結果如下 :




處理函式 search_text() 並非我原創, 而是透過詢問 ChatGPT 改寫而來. ChatGPT 真是程式員的好幫手啊! 因為以後會重複用到, 所以特別寫個簡化範例來記錄作法. 

沒有留言 :