Python tkinter text modified callback

后端 未结 2 2014
野趣味
野趣味 2020-12-10 17:04

In python 2.7, I am trying to get a callback every time something is changed in the Tkinter Text widget.

The program uses multiple frames based on code found here:

2条回答
  •  萌比男神i
    2020-12-10 17:37

    I integrated the above <>> example in my code and it worked quite well, except that it was interfering with some edit_modified() commands.

    Fortunately, the tkinter Text window has a poorly documented feature which is as good and is fully compatible with the edit_modified() get or set commands: the predefined <>> tag. You don't even have to create it, it works out-of-the-box.

    Here are the relevant parts of my code:

    The "self" prefixes were removed, some adjustments may be needed

    Put that in your Text gadget code:

    title = set_title(fname, numbr)

    text.bind("<>", lambda dummy: save_indicator(title))

    Make sure these functions are visible:

    def set_title(fname, numbr):  
        "Creates a window title showing the save indicator,"  
        "the file name and a window number"  
        fname = strip_path(fname)  
        if not fname:  
            fname = "(New Document)"  
        return "+ {} - Window no.{}".format(fname, numbr)  
    
    def strip_path(fname):  
        return os.path.split(fname)[-1]
    
    def save_indicator(title, event=None):  
        "Update the window title"  
        titre = toggle_star(title)  
        text.winfo_toplevel().title(title)  
    
    def toggle_star(title):  
        "Change the first character of the title"  
        chr='+'; chr0='x'  
        if text.edit_modified():  
            title = chr0 + title[1:]  
        else:  
            title = chr + title[1:]  
        return title  
    

    Here is a complete working example with the predefined <>> tag:

    def toggle_star(title):  
        "Change the color of the star in the title bar"  
        chr='+'; chr0='x'  
        if text.edit_modified():  
                title = chr0 + title[1:]  
        else:  
                title = chr + title[1:]  
        return title  
    
    def set_title(fname, winno):  
        "Put save indicator, file name and window number in the title"  
        if not fname:  
                fname = "(New Document)"  
        return "+ {} - Window no.{}".format(fname, winno)  
    
    def mockSave(title, event=None):  
        title = toggle_star(title)  
        root.winfo_toplevel().title(title)  
        text.edit_modified(0)  
    
    def read_ed_mod():  
        print("text.edit_modified()=", text.edit_modified())  
    
    def onModification(title, event=None):  
        title = toggle_star(title)  
        root.winfo_toplevel().title(title)  
    
    from tkinter import *  
    
    fname = 'blabla.txt'  
    winno = 1 ;  
    
    root = Tk()  
    label = Label(root, anchor="w")  
    text = Text(root, width=40, height=4)  
    label.pack(side="bottom", fill="x")  
    text.pack(side="top", fill="both", expand=True)  
    Button(root, text='Mock Save', command= lambda: mockSave(title)).pack(side=LEFT)  
    Button(root, text='Read ed_mod', command= lambda: read_ed_mod()).pack(side=RIGHT)  
    text.bind('<>', lambda event: onModification(title))  
    
    title = set_title(fname, winno)  
    root.winfo_toplevel().title(title)  
    text.edit_modified(0)  
    
    root.mainloop()  
    

提交回复
热议问题