python - libreria - Volver a vincular "seleccionar todo" en el widget de texto
tkinter button (2)
Los enlaces predeterminados se aplican a la clase de widget. Cuando haces un enlace, afecta un widget específico y ese enlace ocurre antes del enlace de clase. Entonces, lo que está sucediendo es que su enlace está sucediendo y luego está ocurriendo el enlace de clase, lo que hace parecer que su enlace no está funcionando.
Hay dos formas de resolver esto. Uno, tu ctext_selectall
puede devolver la cadena "break", lo que evitará que el enlace de clase se ctext_selectall
. Eso debería ser lo suficientemente bueno para resolver su problema inmediato.
La segunda solución implica cambiar el enlace de clase para que su enlace preferido se aplique a todos los widgets de texto. Lo harías usando el método bind_class
.
Aquí hay un ejemplo de volver a vincular la clase:
def __init__(...):
self.root.bind_class("Text","<Control-a>", self.selectall)
def selectall(self, event):
event.widget.tag_add("sel","1.0","end")
effbot.org tiene un escrito bastante decente titulado Eventos y enlaces . Se detalla un poco más acerca de las vinculaciones de clases y widgets y el orden en que ocurren.
El mecanismo de enlace de Tk es lo mejor de cualquier conjunto de herramientas GUI. Una vez que comprenda cómo funciona (y es notablemente simple) encontrará que es fácil aumentar o reemplazar cualquiera o todos los enlaces predeterminados.
Estoy trabajando con el widget de texto y tengo un problema con los atajos de la vieja escuela que usa Tk.
Es decir:
Seleccionar todo: Ctrl + /
vs Ctrl + a
Cortar: Ctrl + w
vs Ctrl + x
Copiar: Meta + w
vs Ctrl + c
Pegar: Ctrl + y
vs Ctrl + v
En Windows, todos funcionan, excepto Ctrl + a.
1) ¿Es posible redireccionar .bind(''<Control-a>'')
, por lo que las .bind(''<Control-a>'')
ya están vinculadas con Ctrl + /?
2) Intenté por "seleccionar todo":
txt_text.bind(''<Control-a>'', self.ctext_selectall)
Dónde:
def ctext_selectall(self, callback):
"""Select all text in the text widget"""
self.txt_text.tag_add(''sel'', ''1.0'', ''end'')
Pero no funciona, ya que Ctrl + a funciona por defecto (el cursor va al inicio). Funciona con alguna otra carta, sin consolidar. ¿Hay alguna posibilidad de que esto funcione si la solución en 1 no es posible?
Siéntase libre de usar el siguiente código o, al menos, comprobar cómo se implementan los métodos select_all
en las clases DiacriticalEntry
y DiacriticalText
. Si eliges usar las clases en lugar del widget que estás usando actualmente, también obtendrás la ventaja de que los usuarios podrán escribir fácilmente ciertos caracteres que de otra manera serían más difíciles de ingresar.
## {{{ http://code.activestate.com/recipes/576950/ (r3)
from tkinter import *
from tkinter.scrolledtext import ScrolledText
from unicodedata import lookup
import os
class Diacritical:
"""Mix-in class that adds keyboard bindings for accented characters, plus
other common functionality.
An inheriting class must define a select_all method that will respond
to Ctrl-A."""
accents = ((''acute'', "''"), (''grave'', ''`''), (''circumflex'', ''^''),
(''tilde'', ''=''), (''diaeresis'', ''"''), (''cedilla'', '',''),
(''stroke'', ''/''), (''ring above'', '';''))
def __init__(self):
# Fix some key bindings
self.bind("<Control-Key-a>", self.select_all)
# We will need Ctrl-/ for the "stroke", but it cannot be unbound, so
# let''s prevent it from being passed to the standard handler
self.bind("<Control-Key-/>", lambda event: "break")
# Diacritical bindings
for a, k in self.accents:
# Little-known feature of Tk, it allows to bind an event to
# multiple keystrokes
self.bind("<Control-Key-%s><Key>" % k,
lambda event, a=a: self.insert_accented(event.char, a))
def insert_accented(self, c, accent):
if c.isalpha():
if c.isupper():
cap = ''capital''
else:
cap = ''small''
try:
c = lookup("latin %s letter %c with %s" % (cap, c, accent))
self.insert(INSERT, c)
# Prevent plain letter from being inserted too, tell Tk to
# stop handling this event
return "break"
except KeyError as e:
pass
class DiacriticalEntry(Entry, Diacritical):
"""Tkinter Entry widget with some extra key bindings for
entering typical Unicode characters - with umlauts, accents, etc."""
def __init__(self, master=None, **kwargs):
Entry.__init__(self, master, **kwargs)
Diacritical.__init__(self)
def select_all(self, event=None):
self.selection_range(0, END)
return "break"
class DiacriticalText(ScrolledText, Diacritical):
"""Tkinter ScrolledText widget with some extra key bindings for
entering typical Unicode characters - with umlauts, accents, etc."""
def __init__(self, master=None, **kwargs):
ScrolledText.__init__(self, master, **kwargs)
Diacritical.__init__(self)
def select_all(self, event=None):
self.tag_add(SEL, "1.0", "end-1c")
self.mark_set(INSERT, "1.0")
self.see(INSERT)
return "break"
def test():
frame = Frame()
frame.pack(fill=BOTH, expand=YES)
if os.name == "nt":
# Set default font for all widgets; use Windows typical default
frame.option_add("*font", "Tahoma 8")
# The editors
entry = DiacriticalEntry(frame)
entry.pack(fill=BOTH, expand=YES)
text = DiacriticalText(frame, width=76, height=25, wrap=WORD)
if os.name == "nt":
# But this looks better than the default set above
text.config(font="Arial 10")
text.pack(fill=BOTH, expand=YES)
text.focus()
frame.master.title("Diacritical Editor")
frame.mainloop()
if __name__ == "__main__":
test()
## end of http://code.activestate.com/recipes/576950/ }}}