mascarar data e valores utilizando Entry do Tkinter

4,293 views
Skip to first unread message

Cauby Osorio

unread,
Jun 9, 2014, 2:48:08 PM6/9/14
to python...@googlegroups.com

 Estou começando a aprender Python por isso desculpe se eu fizer uma pergunta não muito pertinente.

Minha primeira pergunta é :

 Tem como mascarar uma data ou  valor ou cpf  usando o Entry do Tkinter ?

 Se positivo e puder dar um exemplo agradeceria muito. 

Ademir Francisco da Silva

unread,
Jun 10, 2014, 9:56:55 AM6/10/14
to python...@googlegroups.com
show = "*"
--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo quot;Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.


-- 
Ademir Francisco da Silva
Skype  ...: Ademir_Francisco_da_Silva

Lario dos Santos Diniz

unread,
Jun 10, 2014, 10:26:49 AM6/10/14
to python...@googlegroups.com
Completando a resposta do amigo Ademir:
Entry(show='*')

aqui explica melhor:
http://www.tutorialspoint.com/python/tk_entry.htm

Lário dos Santos Diniz
Administrador PDMS, Programador, Desenhista projetista.
+21 820717-49
Consultorias e Inovações
www.softwarecurriculo.com.br/LarioDiniz
Gosta de Metal? Conheça a Minha banda:
www.aconegro.com



















Gustavo H. C.

unread,
Jun 10, 2014, 3:32:00 PM6/10/14
to python...@googlegroups.com
Acho que você quis dizer máscara no sentido de formatar os campos com barras, pontos e traços, certo?
É uma forma antiga de dizer, isso me lembra o tempo de clipper e o mask nos campos.

Dá uma olhada neste código[1], me parece bem escrito e acho que resolve seu problema.
Abraço
-Gustavo

Cauby Osorio

unread,
Jun 10, 2014, 4:18:29 PM6/10/14
to python...@googlegroups.com
  É isso mesmo que eu queria Gustavo colocar 00/00/000 ou no CPF 999.999.999/99.
 Desculpem pela pergunta mau formada, como Gustavo comentou sou desse tempo de Clipper, Cobol vou dar uma olhada no link que você enviou se der zebra eu falo.

  Obrigado.  

Cauby Osorio

unread,
Jun 11, 2014, 1:09:08 PM6/11/14
to python...@googlegroups.com
Gustavo agradeço o link que você me enviou mais achei o código muito complexo estou dando meus primeiros passos com o Python a maioria das funções que tem neste link eu nem conheço.
Para formatar uma data ou cpf no Entry do Tkinter precisa disso tudo mesmo ?
Se tiver um jeito mais simples agradeço.

Obrigado.

Cauby Osorio

unread,
Jun 11, 2014, 3:49:19 PM6/11/14
to python...@googlegroups.com
 Postei uma duvida mais foi mau formulada e eu não tive a resposta que queria, peço  desculpa e farei a pergunta novamente.

   Venho de uma linguagem que foi descontinuada (Visual Fox Pro) fui encarregado de pesquisar uma nova linguagem para empresa, me falaram bem do Python com um pouquinho de tempo que tenho quando chego em casa estou estudando a linguagem,  na empresa que é MUITTOOO pequenininha tempo para isso é quase impossível.

Peço paciência porque meu conhecimento em Python é muito pequeno.
Estou usando Python com Eclipse e pydev e usando a biblioteca visual Tkinter 

me deparai com um problema,  queria digitar no Entry uma data no outro Entry um valor e em outro Entry um CPF.
Como fazer isso no Python ?

No Visual Fox tem uma propriedade Value eu outra inputmask do Textbox que equivale o Entry.
Para data eu colocava textbox.value = {} e meu textbox estava pronto para digitar uma data.
Para valor eu colocava textbox.inputmask = "###.###.##9,99" e meu textbox já estava pronto para digitar um valor

Se me derem um exemplo do modo mais simples para isso agradeço muito.
Lembre que sou muittoooo novo com Python.

Mais uma vez obrigado.

Gustavo H. C.

unread,
Jun 12, 2014, 8:57:15 PM6/12/14
to python...@googlegroups.com
Cauby, que eu saiba não tem um jeito simples de fazer.
Mas o que todo mundo faz é criar uma classe e reutilizar ela por toda a vida.
Eu também sou do tempo do dbase/clipper e não entendo em que parte da história as masks deixaram de ser importantes, isso porque só agora no html 5 estão implementando algo parecido para web e mesmo assim não resolve o problema - coisa que o xbase fazia muito bem há 30 anos atrás.
De qualquer forma, você terá sim que escrever código.



--

Maxwell Morais

unread,
Jun 12, 2014, 10:19:10 PM6/12/14
to python...@googlegroups.com

Cauby, apesar de trabalhar somente com web, eu sou um grande otimista em relação a tkinter, há mais de um ano eu crei este código que faz exatamente o que você está buscando.

https://gist.github.com/MaxMorais/5388218

Você apenas precisa copiá-lo em algum lugar, e importar dentro do seu código, ele foi desenvolvido para ser compátivel com os Widgets do tkinter, todos os métodos do Entry do tkinter estão disponíveis nestas classes.

Um exemplo simples de como utilizar seria:

import Tkinter
from maskedentry import MaskedWidget

root = Tkinter.tk()
masked = MaskedWidget(root, mask="999.999.99-99")
masked.grid(0,0)
root.mainloop()

Veja a unica diferença entre este exemplo e o que você citou do Visual Fox Pro, é que no lugar de usar “#” para informar um caractere numérico é utilizado “9” ou “a” para letras

--

Best Regards.

Maxwell Morais
Python Developer powered by Webnotes framework <3

Maxwell Morais

unread,
Jun 12, 2014, 11:03:16 PM6/12/14
to python...@googlegroups.com
Apenas complementando meu email anterior, além de usar formatos com máscara, você também pode formatar números e moedas, no caso de números basta informar a mascara como "numeric", o formato padrão de números é o americano "1,263,596.66" para mudar para o padrão brasileiro você apenas precisa adicionar dois argumentos, "dec_sep=','" and "tho_sep='.'", sendo "dec_sep=decimal_separator" (separador decimal, e "tho_sep=thousand_separator", (separador de centenas), e no caso de moeda você deve adicionar o argumento "symbol='R$'"

Linux - Junior Polegato

unread,
Jun 13, 2014, 9:12:28 AM6/13/14
to python...@googlegroups.com
Em 12-06-2014 21:57, Gustavo H. C. escreveu:
> Cauby, que eu saiba não tem um jeito simples de fazer.
> Mas o que todo mundo faz é criar uma classe e reutilizar ela por toda
> a vida.
> Eu também sou do tempo do dbase/clipper e não entendo em que parte da
> história as masks deixaram de ser importantes, isso porque só agora no
> html 5 estão implementando algo parecido para web e mesmo assim não
> resolve o problema - coisa que o xbase fazia muito bem há 30 anos atrás.
> De qualquer forma, você terá sim que escrever código.

Olá!

Em vista disso eu tenho o Pole [1], mais especificamente o
PoleUtil [2], que faz já todas as formatações. Se estivesse utilizando o
GTK, poderia ainda utilizar o PoleGTK [3] que faz o tratamento
diretamente no editor ou via botão no caso de data, que abre um calendário.

No caso do PoleUtil tenho tipos específicos como CEP, Nome,
Título, Inteiro Positivo, Dinheiro, dentre outros tipos, que poder ser
utilizados nas funções "convert_and_format" e na "formatar".

Qualquer dúvida estou à disposição.

[1] https://github.com/JuniorPolegato/pole
[2]
https://github.com/JuniorPolegato/pole/blob/master/fontes/pole/PoleUtil.py
[3]
https://github.com/JuniorPolegato/pole/blob/master/fontes/pole/PoleGTK.py

--

[]'s

Junior Polegato

Cauby Osorio

unread,
Jun 13, 2014, 10:26:53 AM6/13/14
to python...@googlegroups.com
Agradeço pelo exemplo mais eu copiei para o meu projeto e esta dando erro tanto na classe que eu peguei como no meu programa vou tentar mandar a linha de codigo e o erro que deu.

        #self.txtcpf = Entry(self.frame4, width="12")
        self.txtcpf =  MaskedWidget(self.frame4, mask="999.999.999-99")
        self.txtcpf.grid(row=0, column=4, sticky="w")

erro:
  Fcliente(master)
  File "C:\Curso\pythonintermediario\PrimeiroProjeto\src\Prog01.py", line 109, in __init__
    self.txtcpf =  MaskedWidget(self.frame4, mask="999.999.999-99")
TypeError: __init__() takes exactly 3 arguments (2 given)

Só coloquei o trecho do codigo e o erro não sei se pode colocar arquivo anexo no grupo.

Na classe maskedentry.py
Erro na linha 271
        if not isinstance(string, basestring): string = str(string)

erro na linha 286
        minus = long(amount)<0

Não sei o que é.
Muito Obrigado

Maxwell Morais

unread,
Jun 13, 2014, 10:40:29 AM6/13/14
to python...@googlegroups.com

Desculpe Cauby!

O que acontece é que passei o exemplo errado, existe um argumento antes da máscara:

O argumento é widget_type que aceita como valor duas opções:
fixed para campos aonde você vai informar uma máscara personalizada
numeric para campos que devem se comportar como números, são eles campos numéricos como inteiros, decimais e moedas.

Eu estava fazendo algumas atualizações ontem para melhorar pequenos trechos.

O campo não suporta ainda porcentagem, mas em breve deve suportar, se você simplesmente baixar o arquivo, e executá-lo com python maskedentry.py você verá um exemplo que está inserido no próprio código.

import Tkinter
from maskedentry import
 MaskedWidget

root = Tkinter.Tk()
frame = Tk.Frame(root)
frame.pack()
my_widget = MaskedWidget(frame, 'fixed', mask='999.999.999-99')
my_widget.pack()

root.mainloop()

Cauby Osorio

unread,
Jun 13, 2014, 7:09:27 PM6/13/14
to python...@googlegroups.com
Obrigado testei com cpf e deu certo.
Vou fazer outra pergunta.
Se eu pegar um campo cpf de uma tabela para mostra na tela formatado, esta classe serve também ?

ex: fazer o select de uma tabela pegar o campo cpf e colocar no Entry formatado 003-678-567-89

O pouquinho que conheço seria assim:
self.txtcpf.insert(INSERT, cli.cpf) mais assim não mostraria a mascara

Como seria a sintaxe.

Mais uma vez obrigado. 

Maxwell Morais

unread,
Jun 14, 2014, 2:15:05 PM6/14/14
to python...@googlegroups.com

Cauby, desculpa a demora, eu fiz os ajustes para que o Widget aceite a inserção de caracteres usando o método insert

https://gist.github.com/MaxMorais/5388218

Os exemplos de sintaxe começam aqui https://gist.github.com/MaxMorais/5388218#file-maskedentry-py-L434

Cauby Osorio

unread,
Jun 14, 2014, 6:03:28 PM6/14/14
to python...@googlegroups.com
  Demora ,kkk .

  Eu e que peço desculpa por tantas perguntas e agradeço, testei a inserção e ficou legal.
  Estou com a tarefa de indicar uma linguagem para substituir a que usamos na empresa , só que tenho que ver isso fora do expediente, estou gostando do Python mais preciso de mais tempo para ver sé este caminho mesmo.

 Mais uma vez muittoooo obrigado.

Maxwell Morais

unread,
Jun 14, 2014, 7:19:39 PM6/14/14
to python...@googlegroups.com
Cauby, sobre aquela sua dúvida sobre tkinter e banco de dados, não sei se você já sabe algo sobre python e banco de dados, mas dá uma olhada neste tutorial http://www.tocadoelfo.com.br/2008/07/python-com-sqlite.html

Eu vou preparar um exemplo bem simples e posto no gist!

Cauby Osorio

unread,
Jun 15, 2014, 9:15:55 AM6/15/14
to python...@googlegroups.com
Vou dar uma olhada, mais uma vez obrigado

Régis Silva

unread,
Jun 15, 2014, 5:28:06 PM6/15/14
to python...@googlegroups.com
Jotage Sales escreveu um material sobre SQLite e PyQt, a essência para Tkinter é a mesma.

Eu tb reescrevei o código no meu github https://github.com/rg3915/pythonDesktopApp/tree/master/pyQt4

Em ambos leia o Db.py e FrmCadCliente.py que vc verá a aplicação de banco de dados.

Reply all
Reply to author
Forward
0 new messages