Lorsque je copie du texte et le collez (crtl + v) dans une entrée tkinter, s'il y a du texte sélectionné, il ne le supprimera pas de l'entrée. Je suis sur Linux (Mint) 64 bits.
tkinter copier-coller dans Entrée ne supprime pas le texte sélectionné
Ici je copie "d" avec (ctrl + c):
Maintenant, je coller "d" (ctrl + v) sur celui-ci mais le résultat est le suivant:
Première: Je veux savoir si cela est un bug spécifique à Linux ou cela est la façon dont il était censé être?
Deuxième: Je pensais à une solution pour cela avec validatecommand
mais je suis un autre problème:
Si je dois supprimer le texte sélectionné dans une commande, je dois connaître l'indice de sélection l'entrée. Sinon, s'il y a plusieurs instances du texte sélectionné directement après et avant le curseur, je ne saurais pas lequel supprimer et remplacer par le nouveau texte. Parce que le curseur pourrait être de chaque côté de la sélection (selon que la personne a fait glisser la souris de droite à gauche ou de gauche à droite sur le texte).
Maintenant, est-il un moyen d'obtenir le index de sélection dans l'entrée? ou une autre façon de contourner ce problème?
est ici un code avec un exemple du problème:
import tkinter as tk
root = tk.Tk()
def validation(after_text, before_text, validation_text, cursor_index):
cursor_index = int(cursor_index)
print('cursor index:', cursor_index)
print('text after change:', after_text)
print('text before change:', before_text)
print('text in need of validation:', validation_text)
try:
selection = root.selection_get()
except:
selection = ''
print('selection:', selection)
# EXAMPLE:
# validation_text = 'd'
# before text = "bb"
# now if someone dragged from right to left on the 2nd b:
# cursor position will be 1 (imagine | as the cursor): 'b|b'
# cursor_index = 1
# after_text = 'bdb' --> but should be 'bd'
# now if someone dragged from left to right on the 2nd b:
# cursor position will be 2 (imagine | as the cursor): 'bb|'
# cursor_index = 2
# after_text = 'bbd' --> but should be 'bd'
# so there is no way for me to know which of these b's I have
# to replace with d based on cursor position alone. I have to
# know the index of selection itself in before_text to be
# able to replace the text properly.
# I don't know how to get that.
return True
txtvar = tk.StringVar(value = 'a-b-c-d-e')
entry = tk.Entry(root, textvariable = txtvar)
font = tk.font.Font(family = entry.cget('font'), size = -50)
entry.config(validate = 'all',
vcmd = (root.register(validation),'%P', '%s', '%S', '%i'),
font = font)
entry.pack()
root.mainloop()
Dans Windows 7/python3, le collage fonctionne comme prévu. – Lafexlos
À propos de chose de sélection, vous pouvez consulter [cette question] (https://stackoverflow.com/questions/4073468/how-do-i-get-a-selected-string-in-from-a-tkinter-text- boîte). Les deux réponses (et ses commentaires) sont très instructifs. – Lafexlos
@Lafexlos J'ai obtenu le texte de sélection ... regarde dans mon essai/sauf. problème que je l'ai expliqué, n'est pas incapable d'obtenir le texte, il ne sait pas exactement d'où vient l'entrée de ce texte (l'index de ce texte de sélection dans le texte entier de l'entrée). – ROAR