【问题标题】:How to make find and replace system in python如何在python中制作查找和替换系统
【发布时间】:2021-06-09 15:15:29
【问题描述】:

这是一个简单的代码,其中我使用 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()

【问题讨论】:

  • 有多种方法可以做到这一点。我建议你看看this。您还知道如何从find_enterreplace_enter 中获取用户的输入吗?
  • 现在创建一个函数,它接受两个参数:text_to_search、word_to_replace、replacement_word 并返回替换后的文本
  • @Tarik 你真的不需要为此创建一个函数。使用起来更简单:text_to_search.replace(word_to_replace, replacing_word)
  • @TheLizzard 我认为它不起作用,因为这将替换 find 内的 word 并替换 gui 而不是 text area 内的。请运行我提供的代码,然后您会更好地理解我的意思。
  • 好吧,一旦你准备好这个函数,你就可以用你从 GUI 得到的文本调用它,得到结果并将它放在文本区域中。

标签: python python-3.x tkinter


【解决方案1】:

这是一个简单的例子(大部分只是 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()

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 2020-06-16
    • 2012-06-05
    • 2021-12-06
    • 2012-01-03
    • 1970-01-01
    相关资源
    最近更新 更多