texto inamovible en tkinter

Aquí hay un código:

from Tkinter import * class Main(object): def __init__(self): self.console = Text(root, relief='groove', cursor='arrow', spacing1=3) self.console.insert(INSERT, '>>> ') self.console.focus_set() self.scroll = Scrollbar(root, cursor='arrow', command=self.console.yview) self.console.configure(yscrollcommand=self.scroll.set) self.scroll.pack(fill='y', side='right') self.console.pack(expand=True, fill='both') root = Tk() root.geometry('%sx%s+%s+%s' %(660, 400, 40, 40)) root.option_add('*font', ('Courier', 9, 'bold')) root.resizable(0, 1) app = Main() root.mainloop() 

¿hay alguna manera de hacer que ‘>>>’ se vuelva inamovible (como en IDLE por ejemplo)? gracias por adelantado.

Echa un vistazo al código fuente de IDLE. En particular, mire ‘smart_backspace_event’ en EditorWindow.py. IDLE vincula en el widget de texto a esta función (indirectamente a través del evento <> ).

El código básico que necesitarás es el siguiente:

 chars = console.get("insert linestart", "insert") # [Do some analysis on "chars" to detect >>> and prevent a backspace] if DO_BACKSPACE: console.delete("insert-1c", "insert") # "break" is important so that the Text widget's backspace handler doesn't get called return "break" 

No hay una forma integrada de hacer esto. Tendrá que configurar una colección de enlaces que anulen el comportamiento predeterminado, y eso no es algo particularmente fácil de hacer. Sin embargo, es posible, ya que tiene control completo sobre todos los enlaces (es decir, ningún comportamiento está codificado en el widget donde no se puede cambiar)

Otra solución que es más a prueba de balas es interceptar los comandos de inserción y eliminación de tkinter de bajo nivel y verificar si hay alguna condición. Para ver un ejemplo, consulte la respuesta a la pregunta https://stackoverflow.com/a/11180132/7432 . Esa respuesta proporciona una solución general que se puede usar para una solicitud (como se solicita en esta pregunta), o para etiquetar cualquier sección del texto como solo lectura.

El ‘>>>’ mostrado en IDLE es una parte de la salida del intérprete de Python. Creo que puede intentar escuchar los eventos y restaurar el indicador cuando sea necesario (consulte http://docs.python.org/library/tkinter.html#bindings-and-events y http://effbot.org/tkinterbook /tkinter-events-and-bindings.htm )