2015-03-20 2 views
2

J'essayais d'utiliser la fonction undo sur mon widget de texte dans tkinter mais sans aucune chance. Je l'ai essayé de cette façon:Annuler fonctionnalité dans le widget texte tkinter

from Tkinter import * 
from ttk import Notebook 

def OnVsb(*args): 
    text.yview(*args) 
    numbers.yview(*args) 

def OnMouseWheel(event): 
    text.yview("scroll", event.delta,"units") 
    numbers.yview("scroll",event.delta,"units") 
    return "break" 

def undo(*argv): 
    text.edit_undo() 

root = Tk() 
defaultbg = root.cget('bg') 
root.bind('<Control-z>', undo) 
note = Notebook(root) 
frame = Frame(note, bd=5, relief=GROOVE, padx=5, pady=5) 
frame.pack() 
bar = Scrollbar(frame, command=OnVsb) 
bar.pack(side=RIGHT, fill=Y) 
numbers = Listbox(frame, width=5, height=30,bg=defaultbg,relief=FLAT, yscrollcommand=bar.set) 
numbers.pack(side=LEFT, fill=Y) 
text = Text(frame,bd=3, width=145, height=30, yscrollcommand=bar.set) 
text.pack(side=LEFT, fill=Y) 
text.bind("<MouseWheel>", OnMouseWheel) 
text.tag_config("attr", foreground="tomato") 
text.tag_config("value", foreground="dark violet") 
text.tag_config("tags", foreground="dodger blue") 
text.tag_config("text", font=("Georgia", "9", "bold")) 
text.focus_set() 
root.lift() 
root.call('wm', 'attributes', '.', '-topmost', '1') 
root.after_idle(root.call, 'wm', 'attributes', '.', '-topmost', False) 
root.mainloop() 

Mais pour une raison quelconque, il ne fait rien. Je pensais qu'il était implémenté par défaut dans le widget texte, mais cela n'a pas fonctionné. Des suggestions sur la façon d'utiliser cette fonctionnalité sur un widget de texte? Tout exemple serait très apprécié.

+0

N'utilisez pas d'arguments arbitraires, utilisez une référence unique à l'événement. C'est, juste un argument. –

+0

Veuillez coller votre code entier pour plus de contexte. –

+0

Pouvez-vous héberger un lien vers le code complet quelque part pour le télécharger? –

Répondre

6

Ok, j'ai finalement trouvé l'information.

Tout ce que je avais besoin est de mettre undo-True quand j'initialisés widget texte, comme ceci:

text = Text(frame,bd=3, width=145, height=30, yscrollcommand=bar.set, undo=True) 

Il n'y a pas besoin pour la fonction undo et text.bind. Il fonctionne automatiquement lorsque undo est True.

0

En Python 2, vous devez définir le mot-clé undo sur True pour activer la pile d'annulation/rétablissement. En Python 3 (au moins 3.6), la pile est activée par défaut.