J'aime l'apparence d'un widget d'entrée tkinter par défaut, mais je veux le rendre en lecture seule sans être grisé.

import tkinter as tk
root = tk.Tk()
entry1_var = tk.StringVar(root, value='Entry1')
entry1 = tk.Entry(root, textvariable=entry1_var)
entry1.configure(state='disabled')
#entry1.configure(background="white") does nothing
entry1.grid()
root.mainloop()

Puis-je changer le style d'une entrée ou dois-je essayer de faire ressembler une étiquette à une entrée par défaut?

MODIFIER

Est-il également possible de conserver le texte de l'entrée sélectionnable tout en étant en lecture seule / désactivé?

1
Aoki Ahishatsu 11 mars 2019 à 12:38

2 réponses

Meilleure réponse

Il existe une option spéciale pour l'arrière-plan et le premier plan lorsque l'entrée est désactivée: disabledbackground et disabledforeground. Ainsi, pour que l'entrée désactivée ressemble davantage à une entrée normale, vous pouvez utiliser:

entry1.configure(disabledbackground="white", disabledforeground="black")

Pour toujours pouvoir sélectionner le texte, vous pouvez utiliser une stratégie différente. Au lieu de définir l'état sur désactivé, utilisez le validatecommand pour interdire toutes les modifications:

import tkinter as tk

def validate():
    return False

root = tk.Tk()

vcmd = (root.register(validate))

entry1_var = tk.StringVar(root, value='Entry1')
entry1 = tk.Entry(root, textvariable=entry1_var, validatecommand=vcmd)
entry1.update()
entry1.configure(validate="key")
entry1.grid()

root.mainloop()

La seule chose à noter est que lorsque vous forcez une modification qui ne devrait pas être autorisée par la validation, en utilisant entry1_var.set('text') par exemple, la validation est désactivée (c'est aussi pourquoi nous avons besoin du entry1.update() pour activement définir le texte avant de commencer la validation). Donc, pour changer le texte, vous devez désactiver la validation, mettre à jour le texte et réactiver la validation comme:

entry1.configure(validate="none")
entry1_var.set("text")
entry1.configure(validate="key")
2
fhdrsdg 11 mars 2019 à 11:15

Vous pouvez également lier un événement à break sur toutes les clés. Vous pourrez toujours sélectionner le texte avec la souris.

import tkinter as tk

root = tk.Tk()
entry = tk.Entry(root)
entry.insert(0,"This is a test")
entry.pack()

def disable_entry(event):
    if event.state == 12 and (event.keysym == 'c' or event.keysym == "a"):
        return
    else:
        return "break"

entry.bind("<Key>", disable_entry)
entry.bind("<Button-2>", disable_entry)

root.mainloop()
2
Henry Yik 11 mars 2019 à 13:21