微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Tkinter文本小部件替换

如何解决Tkinter文本小部件替换

tkinter中是否有replace()方法以外的任何方法,例如,我可以替换一些特定的方法: “ hello”,如果我想将“ h”替换为“ a”,它将是->“ aello”,tkinter中replace()方法的问题是它只能替换{ {1}}小部件。

换句话说,我可以通过提供要替换的字符而不是要替换的字符的索引来替换字符串吗?例如,我想执行类似Text()的操作来自动找到“ hello”的索引,并将这些字符替换为“再见”。

解决方法

我这样的方法是扩展窗口小部件。以下是使用replace的2个版本扩展窗口小部件的示例。普通版本和regex版本。

import tkinter as tk,re
from typing import Pattern


class Text(tk.Text):
    @property 
    def text(self) -> str:
        return self.get('1.0','end')
        
    @text.setter
    def text(self,value:str):
        self.delete('1.0','end')
        self.insert('1.0',value)
        
    def __init__(self,master,**kwargs):
        tk.Text.__init__(self,**kwargs)
        
    def replace(self,find:str,sub:str):
        self.text = self.text.replace(find,sub)
        
    def reg_replace(self,find:Pattern,sub:str):
        self.text = find.sub(sub,self.text)
        

class Main(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        
        self.grid_rowconfigure(0,weight=1)
        self.grid_columnconfigure(0,weight=1)
        
        textfield = Text(self)
        textfield.grid(row=0,column=0,sticky='nswe',columnspan=2)
        
        re_find = re.compile('hello',re.I)
        find    = "Hello"
        sub     = "Goodbye"
        
        tk.Button(self,text='replace',command=lambda: textfield.replace(find,sub)).grid(row=1,sticky='e')
        tk.Button(self,text='regex replace',command=lambda: textfield.reg_replace(re_find,column=1,sticky='e')
        

if __name__ == "__main__":
    root = Main()
    root.geometry('800x600')
    root.title("Text Replace Example")
    root.mainloop()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。