首页 > 解决方案 > 如何在python中制作查找和替换系统

问题描述

这是一个简单的代码,其中我使用 tkinter 创建了一个文本区域和一个菜单,其中有一个查找和替换选项,如果用户单击它,则会出现一个 gui,用户将在其中输入他们想要的单词替换,然后是他们想要替换的单词,但直到现在我刚刚创建了一个 gui。但是我如何用我创建的文本区域的文本用用户给出的单词替换单词。

from tkinter import *
import tkinter.font as font
from tkinter import messagebox
root = Tk()
root.title("MyCodeEditor")
editor = Text()
editor.pack()
menu_bar = Menu(root)
def find_replace():
    f = Tk()
    f.title("Find and Replace")
    find_label = Label(f,text = "Find : ")
    replace_label = Label(f,text = "Replace : ")
    find_label.grid(row  = 0 , column = 0)
    replace_label.grid(row = 3 , column = 0)
    global find_enter
    global replace_enter
    find_enter = Entry(f,fg = "black" , background = "blue",borderwidth = 5,width = 40)

    replace_enter = Entry(f,fg = "black" , background = "blue", borderwidth = 5,  width =40 )
    find_enter.grid(row = 0 , column = 1)
    replace_enter.grid(row = 3 , column = 1)
    btn_replace = Button(f,text = 'Replace',fg = 'black',command = None)
    btn_replace.grid(row=0, column = 5)
format_bar = Menu(menu_bar , tearoff = 0)
format_bar.add_command(label = 'Find and Replace',command = find_replace)
menu_bar.add_cascade(label = 'Format' ,menu = format_bar )
root.config(menu = menu_bar)

root.mainloop()

标签: pythonpython-3.xtkinter

解决方案


这是一个简单的例子(大部分只是 GUI 外观,主要部分是实际replace方法):

from tkinter import Tk, Text, Entry, Frame, Button, Toplevel, Label, Menu, TclError, IntVar

normal_font = ('comicsans', 10)


class FindAndReplace(Toplevel):
    def __init__(self, parent, text_widget: Text):
        Toplevel.__init__(self, parent)
        self.focus_force()
        self.title('Find and Replace')
        self.geometry('500x200')
        self.resizable(False, False)
        self.parent = parent
        self.widget = text_widget

        try:
            self.start_index = self.widget.index('sel.first')
            self.end_index = self.widget.index('sel.last')
        except TclError:
            self.start_index = '1.0'
            self.end_index = 'end'

        self.to_find = None
        self.to_replace = None

        # creating find entry

        find_frame = Frame(self)
        find_frame.pack(expand=True, fill='both', padx=20)

        Label(find_frame, text='Find:', font=normal_font).pack(side='left', fill='both', padx=20)
        self.find_entry = Entry(find_frame)
        self.find_entry.pack(side='right', expand=True, fill='x')

        # creating replace entry

        replace_frame = Frame(self)
        replace_frame.pack(expand=True, fill='both', padx=20)

        Label(replace_frame, text='Replace:', font=normal_font).pack(side='left', fill='both', padx=20)
        self.replace_entry = Entry(replace_frame)
        self.replace_entry.pack(side='right', expand=True, fill='x')

        # creating buttons

        button_frame = Frame(self)
        button_frame.pack(expand=True, fill='both', padx=20)

        Button(button_frame, text='Cancel', font=normal_font,
               command=self.destroy).pack(side='right', fill='x', padx=5)

        Button(button_frame, text='Replace', font=normal_font,
               command=self.replace).pack(side='right', fill='x', padx=5)

    def __find_get(self):
        self.to_find = self.find_entry.get()

    def __replace_get(self):
        self.to_replace = self.replace_entry.get()

    def replace(self):
        self.__find_get()
        self.__replace_get()

        if not self.to_replace:
            return

        length = IntVar()
        index = self.widget.search(self.to_find, self.start_index, stopindex=self.end_index, count=length)
        end_index = self.widget.index(index + f'+{length.get()}c')

        self.widget.delete(index, end_index)
        self.widget.insert(index, self.to_replace)


root = Tk()

menu_bar = Menu(root)
file_menu = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label='File', menu=file_menu)
file_menu.add_command(label='Find and Replace', command=lambda: FindAndReplace(root, text))
root.config(menu=menu_bar)

text = Text(root)
text.pack()

root.mainloop()

显然可以添加一些其他功能,例如全部替换


推荐阅读