Estou trabalhando atualmente com a biblioteca ttkbootstrap em vez da biblioteca ttk no passado. Eu costumava usar o widget ttk DateEntry no estado "somente leitura", que funcionava perfeitamente bem. No entanto, por alguns motivos, preciso parar de usar a biblioteca ttk e, em vez disso, usar a biblioteca ttkbootstrap. Então eu criei um ttkbootstrap DateEntry como dito nas documentações: https://ttkbootstrap.readthedocs.io/en/latest/styleguide/dateentry/
import ttkbootstrap as tb
from ttkbootstrap import constants
root = tb.Window()
date_entry = tb.DateEntry(root)
date_entry.pack(padx = 10, pady = 10)
date_entry["state"] = "readonly"
root.mainloop()
O estado 'somente leitura' está em vigor porque não consigo escrever com o keboard na entrada. No entanto, quando tento escolher uma nova data, a data não parece mudar, de modo que a entrada será apenas na data de hoje para sempre.
Eu sei que esta interação está especificamente ligada à biblioteca ttkbootstrap porque o widget dateentry funcionou perfeitamente bem na biblioteca ttk.
Tentei pesquisar no código fonte da classe DateEntry mas não encontrei nada que explicasse esse comportamento. Ainda tenho certeza de que não é impossível criar uma DateEntry somente leitura, pois é uma das coisas mais importantes que você precisa nesta biblioteca.
Você não deve editar o código do ttkbootstrap. Ele seria substituído na próxima atualização.
Você pode simplesmente criar uma nova classe herdando de
DateEntry
, definindo o estado da entrada no init e habilitando o campo somente quando você pressionar o botão:Editar: chamando
super()._on_date_ask()
em vez de escrever uma nova função, conforme sugerido por @acw1668.O estado readonly faz com que a data só possa ser lida e não alterada/editada, então define-a como a data atual, bastante autoexplicativo, eu acho, minha pergunta seria por que não apenas se livrar da linha somente leitura desde o usuário ainda pode selecionar a data através do pop-up do calendário?
Ok, acabei de entrar no código-fonte do ttkbootstrap DateEntry e copiar a classe e também a classe Querybox. Para evitar esse problema, expliquei que encontrei uma coisa, você deve vincular a entrada de data a uma variável de texto global. Então você pode alternar todos
entry.insert(...)
com otextvariable.set(...)
. Você também precisa transformar todas as inserções natextvariable.get(...)
classe Querybox copiada.Aqui está a classe DateEntry:
e a classe Querybox: