Capturar pressionamento de teclas

1,281 views
Skip to first unread message

MuriloCunha

unread,
Jul 7, 2014, 8:01:25 AM7/7/14
to python...@googlegroups.com
Pessoal,

Estou fazendo uma aplicacao com TKinter e Python 3.3.
Nesta aplicacao tem um ENTRY que espera o usuario digitar um codigo contendo letras e numeros.
Gostaria de ao clicar qualquer tecla o sistema transformasse o caractere para MAIUSCULAS, a medida que o usario vá digitando.
Semelhante ao evento OnKeyPress do Delphi.

Estou fazendo desta forma:

...
class FiltrosOpcionais():
    def SFLT(self):
        # Setor
        self.lblSetor = Label(self.frmA, text='Setor:', width=20, anchor=W)
        self.strSetor = StringVar();
        self.edtSetor = Entry(self.frmA, justify=CENTER, textvariable=self.strSetor)
        self.lblSetor.grid(row=0, column=0, padx=3)
        self.edtSetor.grid(row=1, column=0, padx=5, sticky=E+W) # Usar sticky para nao definir o tamanho para o edit
        self.edtSetor.bind('<KeyPress>', lambda:FiltrosOpcionais.PassarParaMaiusculas(self, self.strSetor, self.edtSetor.get()))
        ...

    def PassarParaMaiusculas(event, varTexto, strTexto):
        StringVar(varTexto).set(strTexto.upper())
    ...
   
Nao estou conseguindo capturar o KeyPress a medida que o usuario vai digitando.
Como fazer?

Obrigado
MuriloCunha

José Ricardo Borba

unread,
Jul 7, 2014, 8:48:51 AM7/7/14
to python-brasil
Precisa fazer tudo isso?
Que tal:
x=input('digite qualquer coisa:')
print(x.upper())

Dá uma olhada aqui [1] também. Às vezes trazemos bagagem de outras linguagens que tornam as coisas mais difíceis di que realmente são. ;-)

[1] - https://www.youtube.com/watch?v=BwAF7ke7Px0

Abraco



--
--
------------------------------------
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.



--
José Ricardo Borba

MuriloCunha

unread,
Jul 7, 2014, 9:22:06 AM7/7/14
to python...@googlegroups.com
Borba,

Admito que carrego alguns vicios (modo de pensar) do Delphi (afinal sao +/- 15 anos programando nela!!)
Mas esta solucao dada nao me atende.
Gostaria que o sistema fosse trocando, em RunTime, o conteudo do ENTRY por letras maiusculas.

Poderia me passar uma forma em RunTime para implementar?


Obrigado
MuriloCunha

José Ricardo Borba

unread,
Jul 7, 2014, 11:17:12 AM7/7/14
to python-brasil
Murilo,

Ainda não entendi o seu objetivo. Mas o código daqui [1] pode te ajudar. Também encontrei este aqui [2], mas aqui não funcionou.
Acredito que utilizando os indices de strings você consiga fazer algo como s=s[-1].upper() para cada tecla pressionada.
Abraco,


--
--
------------------------------------
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.



--
José Ricardo Borba

Willie

unread,
Jul 7, 2014, 11:50:21 AM7/7/14
to python...@googlegroups.com
Acho que você pode fazer o bind assim:
self.edtSetor.bind('<Any-KeyPress>', lambda:FiltrosOpcionais.PassarParaMaiusculas(self, self.strSetor, self.edtSetor.get()), "+")

MuriloCunha

unread,
Jul 7, 2014, 11:51:45 AM7/7/14
to python...@googlegroups.com
Jose,

Muito obrigado pelo esforco em me ajudar.

Vou explicar detalhadamente o que gostaria.
Tenho um ENTRY onde o usuario vai digitar um certo codigo, por exemplo: "etn 2421".
Vamos supor que este codigo seja uma placa de um carro (pode ser qualquer coisa!)
No entanto, em meu banco, todas as placas de carro tem suas letras em maiusculas.
Mas, a marca do veiculo nao esta gravada com todas as letras maiusculas (Ford, Wolks...).
Entao, nao posso travar a procura somente por letras maiusculas.
Nos controles (widgets) de procura de placas tenho q travar tudo em maiusculas. E nao posso deixar para o usuario lembrar disso.
O sistema vai se preocupar em trocar tudo por maiusculas, quando for o caso. E deixar livre, quando nao importar maiusculas de minusculas.
O que estou parado eh em uma maldita tela de procura. Esta tela tem varios widgets que sao os parametros de procura: Nome, placa, ano, RENAVAM....
Gostaria q quando o usuario entrasse em um widget que fosse importante maiusculas o sistema vah trocando o conteudo (em RunTime) para maiusculas.
Por exemplo:

Procurando por: ETN 1234
Pressionado: e ---> trocado por E
Pressionado: t ---> trocado por ET
Pressionado: n ---> trocado por ETN
Pressionado: [espaco] ---> [espaco]
Pressionado: 1234 ---> trocado por ETN 1234

Se quiser te envio o .PY para vc analisar.


Obrigado
MuriloCunha




Em segunda-feira, 7 de julho de 2014 09h01min25s UTC-3, MuriloCunha escreveu:

Joao S. O. Bueno

unread,
Jul 7, 2014, 12:07:16 PM7/7/14
to Python Brasil
Oi Murilo -

Então, ao usar Tkinter, aplicações que só consomem formulaŕios
preenchidos em geral podem só
adicionar callbacks para entradas de menus e para a chave "command" dos botões.

Quando queremos modificar o funcionamento padrão dos widgets, temos
que escutar eventos
de outras formas - no caso, para saber quando uma tecla foi
pressionada em uma entrada,
podemos usar o método bind, capturando o evento "<Key>".

Algo do tipo

entrada.bind("<key>", mudar_texto_do_widget_para_maiusculas)

Se o <key> fosse gerado depois da tecla ser processada, seria só isso: só que
os <Key> é gerado antes da tecla ser adicioanda ao texto da entrada.
Isso gera um problema
por que se ao receber o evento você tentar mudar tudo pra maiusculas,
a tecla digitada ainda fica inalterada.

Uma vez que o tkitner nao tem eventos mais esepcializados (pro exemplo
"KeyUp" ou um
"Changed" para o entry), a solução então é ao tratar o evendo <Key>
agendar um timer para
chamar um método que vai passar o texto do widget para maiúsculas:

Veja a documentação de eventos em:

http://effbot.org/tkinterbook/tkinter-events-and-bindings.html

Eu escrevi um pequeno exemplo de como pode funcionar:

import tkinter

window = tkinter.Tk()
text = tkinter.Variable()
entry = tkinter.Entry(window, textvariable=text)
entry.pack()

def key_handler(variable, event):
if hasattr(event, "char") and event.char:
event.widget.after(30, lambda: set_to_upper(variable))

def set_to_upper(variable):
variable.set(variable.get().upper())

entry.bind("<Key>", lambda event: key_handler(text, event))

tkinter.mainloop()

(está no endereço http://pastebin.com/DJNEY2cP - a unica diferença
para este exemplo entre Python3 e 2 é o nome do módulo:
tkinter x Tkinter)

(O José Borba, apesar da boa vontade, ainda não percebeu que voce está
lidando com
Tkitner e está passando receitas para tratar entrada a partir do
terminal - nao tem nada a ver com o seu problema e isso está gerando
alguma confusão para os dois . O exemplo do Willer tá bem quente, mas
tem esse detalhe do
timer )

Joao S. O. Bueno

unread,
Jul 7, 2014, 12:08:03 PM7/7/14
to Python Brasil
Ops - escrevi "Willer" no e-mail anterior - é "Willie" - desculpe, :-/

MuriloCunha

unread,
Jul 7, 2014, 1:01:06 PM7/7/14
to python...@googlegroups.com
Pessoal,

AGRADECO DE CORACAO a todos os que tentaram me ajudar.
Especialmente ao BORBA, WILLIE e JOAO BUENO.

Realmente Joao Bueno, estou trabalhando com TKinter.
Adorei o tempo gasto comigo (texto bem explicado e com outras caracteristicas do tkinter q nao sabia - simplicidade dos eventos)

Willie nao entendi o objetivo do sinal de "+" no fim da instrucao BIND. Nao consegui ver diferenca nenhuma.
O que este sinal faz?

Borba, vc tem razao... se estivesse em um terminal sua solucao seria de cara a melhor!!


Estou trabalhando nesta tela desde as 08:30h de hoje.
Somente agora consegui descobrir o que estava acontecendo.
Nao exatamente, mas acho q com meu nivel de conhecimento em Python (nivel basico) estah satisfatorio.

Vou postar duas solucoes...
A primeira eh colocando todos os controles da tela em uma unica classe e trabalhando os metodos dentro desta classe.
Nunca usando metodos globais, somente dentre desta classe.
Fiz alguns comentarios no codigo...
#!/usr/bin/python
# -*- coding: iso-8859-1 -*-

from tkinter import Toplevel, Label, Entry, Button, Frame, Text, PanedWindow, Scrollbar, StringVar
from tkinter.constants import END, SUNKEN, HORIZONTAL, VERTICAL, N, S, E, W, CENTER
from tkinter import Tk, mainloop
from datetime import date

#import SQL
#from Util import CentralizarJanela

class Filtros():
    def __init__(self, parent=None, strSQL=None):
        # TOPLEVEL
        #self.frmFilha = Toplevel()
        # Para testes somente nesta tela, ative a linha abaixo
        self.frmFilha = parent
       
        # Criar os controles de Data Inicial e Final
        self.SFLT()
       
        # PANED WINDOW -->> Lugar do FRAME B
        self.pwA = PanedWindow(self.frmFilha, orient=HORIZONTAL)
       
        self.frmC = Frame(self.frmFilha, border=1, relief=SUNKEN)
        self.frmC.grid(row=2, column=0, columnspan=2, sticky=E+W)

        # MEMO
        self.mmoSQL = Text(self.pwA, height=10)
        self.mmoSQL.insert(END, strSQL)
        self.sbarV = Scrollbar(self.frmFilha, orient=VERTICAL, command=self.mmoSQL.yview)
        self.mmoSQL.config(yscrollcommand=self.sbarV.set)
        self.sbarV.grid(row=1, column=1, sticky=N+S)
        self.pwA.add(self.mmoSQL)

        # BOTOES
        self.btnOK = Button(self.frmC, text='OK', width=20)
        self.btnOK.grid(row=0, column=0, sticky=E+W, padx=5, pady=5)
        self.btnOK.bind('<1>', self.PassarParametros)
        self.btnCancelar = Button(self.frmC, text='Cancelar', width=20)
        self.btnCancelar.grid(row=0, column=1, padx=5, pady=5)
        self.btnCancelar.bind('<1>', self.Cancelar)
       
        self.pwA.grid(row=1, column=0, sticky=N+S+E+W)
       
        self.frmFilha.resizable(False, False)

        # Centralizar Janela
        self.frmFilha.update()
        #CentralizarJanela(self.frmFilha, self.frmFilha.winfo_width(), self.frmFilha.winfo_height())
       
    def PassarParametros(self, event=None):
        print('Data Inicial: {} - Data Final: {}'.format(self.edtDataI.get(), self.edtDataF.get()))
        Param = []
        Param.append(self.edtDataI.get())
        Param.append(self.edtDataF.get())
        # Apos o DESTROY, eh executado as linhas abaixo
        self.frmFilha.destroy()
        print(Param)
        # Apos o RETURN, nao eh executado qualqer comando
        return Param
       
    def Cancelar(self, event=None):
        print('Nao retornar qualquer parametro')
        self.frmFilha.destroy()
       
       
# SETOR, FAZENDA, LOTE e TALHAO
    def SFLT(self):
        self.frmA = Frame(self.frmFilha, border=2, height=200, relief=SUNKEN)
        self.frmA.grid(row=0, column=0, sticky=N+S+E+W, columnspan=2)
        # Setor
        self.strSetor = StringVar();

        self.lblSetor = Label(self.frmA, text='Setor:', width=20, anchor=W)
        self.edtSetor = Entry(self.frmA, justify=CENTER, textvariable=self.strSetor)
        self.lblSetor.grid(row=0, column=0, padx=3)
        self.edtSetor.grid(row=1, column=0, padx=5, sticky=E+W) # Usar sticky para nao definir o tamanho para o edit
        # O PULO-DO-GATO estah em:
        # 1) Declarar uma variavel EVENT no lambda, no entanto nao precisa passar para o metodo
        #     Desta forma o Python nao reclama, nesta linha, que estah faltando parametro para o metodo
        # 2) Usar o evento <KeyRelease>, assim, tudo que vc digitar serah convertido, pois o digito aparece ao PRESSIONAR a tecla,
        #    evento de "baixar" a tecla, quando soltar a tecla, o texto estarah disponivel no widget para conversao.
        # 3) No metodo PASSARPARAMAIUSCULAS, declare EVENT, este serah passado junto com o SELF (linha abaixo)
        self.edtSetor.bind('<KeyRelease>', lambda event:self.PassarParaMaiusculas(self, self.strSetor, self.edtSetor.get()))
        self.strSetor.set('Zero')
        # Fazenda
        self.lblFazenda = Label(self.frmA, text='Fazenda:', width=20, anchor=W)
        self.edtFazenda = Entry(self.frmA, justify=CENTER)
        self.lblFazenda.grid(row=0, column=1, padx=3)
        self.edtFazenda.grid(row=1, column=1, padx=5, sticky=E+W)
        # Lote
        self.lblLote = Label(self.frmA, text='Lote:', width=20, anchor=W)
        self.edtLote = Entry(self.frmA, justify=CENTER)
        self.lblLote.grid(row=0, column=2, padx=3)
        self.edtLote.grid(row=1, column=2, padx=5, sticky=E+W)
        # Talhao
        self.lblTalhao = Label(self.frmA, text='Talhão:', width=20, anchor=W)
        self.edtTalhao = Entry(self.frmA, justify=CENTER)
        self.lblTalhao.grid(row=0, column=3, padx=3)
        self.edtTalhao.grid(row=1, column=3, padx=5, sticky=E+W)

        # Data Inicial
        self.lblDataI = Label(self.frmA, text='Data inicial (aaaa-mm-dd):', width=20, anchor=W)
        self.edtDataI = Entry(self.frmA, justify=CENTER)
        self.edtDataI.insert(0, date.fromordinal(date.toordinal(date.today())-30))
        self.lblDataI.grid(row=2, column=0, padx=3)
        self.edtDataI.grid(row=3, column=0, padx=5, sticky=E+W)

        # Data Inicial
        self.lblDataF = Label(self.frmA, text='Data final (aaaa-mm-dd):', width=20, anchor=W)
        self.edtDataF = Entry(self.frmA, justify=CENTER)
        self.edtDataF.insert(0, date.today())
        self.lblDataF.grid(row=2, column=1, padx=3)
        self.edtDataF.grid(row=3, column=1, padx=5, sticky=E+W)
       
    def PassarParaMaiusculas(self, event, varString, strTexto):
        print('Entrei na funcao')
        varString.set(strTexto.upper())
       
root = Tk()
Filtros(root, strSQL='SELECT...')
mainloop()
print('Encerrando aplicacao')

( mesmo codigo acima: http://www.pastebin.com.br/601 )




A outra forma eh criar uma classe separada para a criacao de filtros opcionais...
Estes filtros serao colcados pela aplicacao principal.... aqui foi adapatada para funcionar sem a aplicacao principal!

#!/usr/bin/python
# -*- coding: iso-8859-1 -*-

from tkinter import Toplevel, Label, Entry, Button, Frame, Text, PanedWindow, Scrollbar, StringVar
from tkinter.constants import END, SUNKEN, HORIZONTAL, VERTICAL, N, S, E, W, CENTER
from tkinter import Tk, mainloop
from datetime import date

#import SQL
#from Util import CentralizarJanela

class Filtros():
    def __init__(self, parent=None, strSQL=None):
        # TOPLEVEL
        #self.frmFilha = Toplevel()
        # Para testes somente nesta tela, ative a linha abaixo
        self.frmFilha = parent
       
        # Criar os controles de Data Inicial e Final
        FiltrosOpcionais.SFLT(self)
       
        # PANED WINDOW -->> Lugar do FRAME B
        self.pwA = PanedWindow(self.frmFilha, orient=HORIZONTAL)
       
        self.frmC = Frame(self.frmFilha, border=1, relief=SUNKEN)
        self.frmC.grid(row=2, column=0, columnspan=2, sticky=E+W)

        # MEMO
        self.mmoSQL = Text(self.pwA, height=10)
        self.mmoSQL.insert(END, strSQL)
        self.sbarV = Scrollbar(self.frmFilha, orient=VERTICAL, command=self.mmoSQL.yview)
        self.mmoSQL.config(yscrollcommand=self.sbarV.set)
        self.sbarV.grid(row=1, column=1, sticky=N+S)
        self.pwA.add(self.mmoSQL)

        # BOTOES
        self.btnOK = Button(self.frmC, text='OK', width=20)
        self.btnOK.grid(row=0, column=0, sticky=E+W, padx=5, pady=5)
        self.btnOK.bind('<1>', self.PassarParametros)
        self.btnCancelar = Button(self.frmC, text='Cancelar', width=20)
        self.btnCancelar.grid(row=0, column=1, padx=5, pady=5)
        self.btnCancelar.bind('<1>', self.Cancelar)
       
        self.pwA.grid(row=1, column=0, sticky=N+S+E+W)
       
        self.frmFilha.resizable(False, False)

        # Centralizar Janela
        self.frmFilha.update()
        #CentralizarJanela(self.frmFilha, self.frmFilha.winfo_width(), self.frmFilha.winfo_height())
       
    def PassarParametros(self, event=None):
        print('Data Inicial: {} - Data Final: {}'.format(self.edtDataI.get(), self.edtDataF.get()))
        Param = []
        Param.append(self.edtDataI.get())
        Param.append(self.edtDataF.get())
        # Apos o DESTROY, eh executado as linhas abaixo
        self.frmFilha.destroy()
        print(Param)
        # Apos o RETURN, nao eh executado qualqer comando
        return Param
       
    def Cancelar(self, event=None):
        print('Nao retornar qualquer parametro')
        self.frmFilha.destroy()
       
       
# SETOR, FAZENDA, LOTE e TALHAO
class FiltrosOpcionais():
   
    def SFLT(self):
        self.frmA = Frame(self.frmFilha, border=2, height=200, relief=SUNKEN)
        self.frmA.grid(row=0, column=0, sticky=N+S+E+W, columnspan=2)
        # Setor
        self.strSetor = StringVar();

        self.lblSetor = Label(self.frmA, text='Setor:', width=20, anchor=W)
        self.edtSetor = Entry(self.frmA, justify=CENTER, textvariable=self.strSetor)
        self.lblSetor.grid(row=0, column=0, padx=3)
        self.edtSetor.grid(row=1, column=0, padx=5, sticky=E+W) # Usar sticky para nao definir o tamanho para o edit
        # O PULO-DO-GATO estah em:
        # 1) Declarar uma variavel EVENT no lambda (obrigatorio a criacao, mas a passagem para o metodo nao eh obrigatoria)
        #     Desta forma o Python nao reclama, nesta linha, que estah faltando parametro para o metodo
        # 2) Usar o evento <KeyRelease>, assim, tudo que vc digitar serah convertido, pois o digito aparece ao PRESSIONAR a tecla,
        #    evento de "baixar" a tecla, quando soltar a tecla, o texto estarah disponivel no widget para conversao.
        # 3) No metodo PASSARPARAMAIUSCULAS, nao precisa declarar EVENT (nao sei exatamente pq. Acho q o BIND envia uma tupla
        #    para o metodo (obrigatoriamente uma tupla) se ele nao conseguir formar esta tupla, dah erro de falta de parametro)
        self.edtSetor.bind('<KeyRelease>', lambda event:FiltrosOpcionais.PassarParaMaiusculas(self, self.strSetor, self.edtSetor.get()))
        self.strSetor.set('Zero')
        # Fazenda
        self.lblFazenda = Label(self.frmA, text='Fazenda:', width=20, anchor=W)
        self.edtFazenda = Entry(self.frmA, justify=CENTER)
        self.lblFazenda.grid(row=0, column=1, padx=3)
        self.edtFazenda.grid(row=1, column=1, padx=5, sticky=E+W)
        # Lote
        self.lblLote = Label(self.frmA, text='Lote:', width=20, anchor=W)
        self.edtLote = Entry(self.frmA, justify=CENTER)
        self.lblLote.grid(row=0, column=2, padx=3)
        self.edtLote.grid(row=1, column=2, padx=5, sticky=E+W)
        # Talhao
        self.lblTalhao = Label(self.frmA, text='Talhão:', width=20, anchor=W)
        self.edtTalhao = Entry(self.frmA, justify=CENTER)
        self.lblTalhao.grid(row=0, column=3, padx=3)
        self.edtTalhao.grid(row=1, column=3, padx=5, sticky=E+W)

        # Data Inicial
        self.lblDataI = Label(self.frmA, text='Data inicial (aaaa-mm-dd):', width=20, anchor=W)
        self.edtDataI = Entry(self.frmA, justify=CENTER)
        self.edtDataI.insert(0, date.fromordinal(date.toordinal(date.today())-30))
        self.lblDataI.grid(row=2, column=0, padx=3)
        self.edtDataI.grid(row=3, column=0, padx=5, sticky=E+W)

        # Data Inicial
        self.lblDataF = Label(self.frmA, text='Data final (aaaa-mm-dd):', width=20, anchor=W)
        self.edtDataF = Entry(self.frmA, justify=CENTER)
        self.edtDataF.insert(0, date.today())
        self.lblDataF.grid(row=2, column=1, padx=3)
        self.edtDataF.grid(row=3, column=1, padx=5, sticky=E+W)
       
    def PassarParaMaiusculas(self, varString, strTexto):
        print('Entrei na funcao')
        varString.set(strTexto.upper())
        #StringVar(varTexto).set(str(strTexto).upper())

root = Tk()
Filtros(root, strSQL='SELECT...')
mainloop()
print('Encerrando aplicacao')

http://www.pastebin.com.br/602



Divirtam-se, pessoal, com este pequeno desafio!!
E para aqueles que estao procurando uma solucao parecida com OnChange do Delphi.

Obrigado a todos

MuriloCunha












Em segunda-feira, 7 de julho de 2014 09h01min25s UTC-3, MuriloCunha escreveu:

Ademir Francisco da Silva

unread,
Jul 7, 2014, 4:26:28 PM7/7/14
to python...@googlegroups.com
Peguei já o "bonde rodando", contudo vai algumas considerações ...

O logo abaixo é totalmente dispensável, já faz alguns bons anos que não precisa-se importar, deste jeito ..., então simplesmente substitua-os no seu código por "strings" em minuscula ( isto em Py27 pode ser que em Py34 tenha-se voltado a forma antiga mas eu não acredito ). ;-)

from tkinter.constants import END, SUNKEN, HORIZONTAL, VERTICAL, N, S, E, W, CENTER

Reparei que você se utiliza do "self" em todas as variáveis, isto é desnecessário, a não ser que você venha a utilizar-se do retorno desta variável em outra parte do programa. ;-)

Confesso que não tive tempo de analisar o seu código, mas já lhe deram algumas soluções.

Ademir

PS .: Analise sempre os códigos principalmente os desatualizados pois apesar de ainda terem a retrocompatibilidade assegurada torna o seu código, digamos, não muito apresentável.
--
--
------------------------------------
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
[ CMC ] God will do me justice

Lario dos Santos Diniz

unread,
Jul 7, 2014, 5:19:36 PM7/7/14
to python...@googlegroups.com
Boa tarde Ademir, tudo bem?

Uma forma mais simples de fazer o que você quer é assim:

# -*- coding: UTF-8 -*-

from Tkinter import *

class MontyPython :
    def __init__(self, janela):
        self.caixa=Frame(janela,borderwidth=3, relief=GROOVE)
        self.caixa.grid()
        self.campo=Entry(self.caixa)
        self.campo.grid(row=1, column=2, sticky=W, pady=3)
        self.current = None
        self.poll()
    def poll(self):
        now = self.campo.get()
        if now != self.current:
            self.list_has_changed(now)
            self.current = now
        self.caixa.after(250, self.poll)
   
    def list_has_changed(self, selection):
        texto=selection.upper()
        self.campo.delete(0, END)
        self.campo.insert(0, texto)
      



swallow=Tk()
MontyPython(swallow)
swallow.mainloop()


PS: É python 2.7

Espero que ajude.

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



















Ademir Francisco da Silva

unread,
Jul 7, 2014, 5:32:41 PM7/7/14
to python...@googlegroups.com
Então ..., não se trata do que eu quero pois eu não quero nada somente lhe forneci algumas, digamos, dicas ... ;-)

veja ..., simplesmente transforme GROOVE em "groove" sem precisar importar nada, e por aí vai ...


Ademir

Ademir Francisco da Silva

unread,
Jul 7, 2014, 5:39:00 PM7/7/14
to python...@googlegroups.com
Mais uma coisa

Os "aviõezinhos" ( -*- ) são totalmente dispensáveis, por serem antigas formas ( talvez para MAC ainda sim, alguém vai se manifestar ... ), caso contrário utilize-se desta forma ...

# coding: utf-8
ou
# encoding: utf-8


Ademir

Em 07/07/2014 18:19, Lario dos Santos Diniz escreveu:

Lario dos Santos Diniz

unread,
Jul 7, 2014, 5:54:47 PM7/7/14
to python...@googlegroups.com
A Sim, a resposta era para o Murilo, desculpe.
:)

Aproveitando, não se usa mais "-*-" em comentários funcionais? Você pode me mandar algum link explicando sobre isso?

Ademir Francisco da Silva

unread,
Jul 7, 2014, 6:03:36 PM7/7/14
to python...@googlegroups.com
Tem diversos comentários neste grupo a respeito procure no histórico do mesmo ... ;-)

Ademir

Willie

unread,
Jul 7, 2014, 11:37:43 PM7/7/14
to python...@googlegroups.com
Willie nao entendi o objetivo do sinal de "+" no fim da instrucao BIND. Nao consegui ver diferenca nenhuma.
O que este sinal faz?
 
Oi Murilo. O sinal de mais ("+") é só uma garantia de que você não está "substituindo" nenhuma função. Por exemplo:

def func_01(evt):
    print "FUNC01"
def func_02(evt):
    print "FUNC02"
my_entry = Entry()
my_entry.bind("<1>", func_01)
my_entry.bind("<1>", func_02)
# com a intenção de executar tanto func_01 e func_02 quando o entry for clicado com o mouse

Mas se você rodar o código só func_02 é executado, porque você substituiu o callback de "<1>" que era func_01 por func_02. O sinal de mais adiciona a função à lista sem substituir.
Mas no caso do seu programa, realmente, ele não faz diferença alguma, visto só haver uma função :)

Toninho Nunes

unread,
Jul 8, 2014, 7:33:08 AM7/8/14
to python...@googlegroups.com
Bom dia,

Só uma curiosidade, uso muito Python, mas voltado para web, quais as vantagens de deixar o Delphi desenvolvendo em Desktop e usar o Python para desktop? Sendo que o desktop a maioria dos sistemas são baeados em Windows, eu ainda continuo desenvolvendo em Delphi mas só mantendo projetos antigos que rodam ainda, mas novos projetos são todos baseado em Python usando Rest para usar em Web e Mobile, tem colegas que partiram para o Lazarus e converteram os seus desktops, e ganharam a multiplataforma.

Toninho
 

MuriloCunha

unread,
Jul 9, 2014, 8:42:38 AM7/9/14
to python...@googlegroups.com
Pessoal,

Adorei a interacao.
Farei alguns comentarios...

Joao Bueno,
Sua ideia foi interessante... usar um TIMER para ir mudando o texto do ENTRY.
Uma saida um tanto trabalhosa para o sistema jah que vai ter q trabalhar varias vezes trocando os caracteres.
Sugiro usar esta tecnica em lugares que o sistema precisa de uma resposta rapida do usuario, por exemplo, atualizacao do sistema, encerramento da aplicacao, confirmacao de execucao, protecao de tela... caso o usuario nao responda por um determinado tempo, o sistema escolhe a opcao menos prejudicial aos dados!
De qualquer forma, é valida...
Existe um evento <KeyRelease> que é disparado ao LARGAR a tecla... semelhante ao OnKeyUp do Delphi. Foi isso que usei!

Ademir,
Adorei as observacoes feitas!
Ate este momente nao sabia pq existia duas formas de declarar estas CONSTANTES do TKINTER.
Achava que era para compatibilidade com outras versoes (nao deixa de ser, mas achava que a declaracao MAIUSCULA era a mais nova)
Realmente, escrever com minusculas a vantagem eh de nao precisar IMPORTAR os modulos. Adorei, vou comecar a usar desta forma.
Jah retirei, tambem, os "avioezinhos".
Como sempre gosto de falar: MENOS É MAIS!!
Ademir, soh nao entendi a questao do SELF
Retirei os SELF´s de minha aplicacao e continuou a funcionar normalmente. Qual a diferenca? Poderia explicar melhor quando usar?
Achei q se nao pusesse o GARBAGE COLLECTION destruiria meus componentes OU nao conseguiria pegar o conteudo dos ENTRY´s em outro ponto do sistema.
Poderia me ajudar a entender seu uso?

Willie,
Tb anotei sua dica!
O sinal de "+" é para adicionar mais metodos a um certo evento no tkinter. Li na documentacao.
Caracas, algumas linhas escondidas na documentacao falando disso! Por isso q poucas pessoas conhecem!

Toninho,
Vc tem razao. Em se tratando de aplicacoes DESKTOP, Delphi eh imbativel (minha opiniao). Muito rapido para desenvolver uma aplicacao completa, apelo visual, compila executaveis em codigo de maquina entre outras. As desvantagens sao: CUSTO (altissimo) da licenca, somente windows, nao atende web, mobile eh limitado entre outras.
Estou comecando em Python. Como somente conheco aplicacoes desktop (por causa do Delphi), o mais facil para eu aprender eh comecar com aplicacoes desta natureza. Se fosse para WEB ou MOBILE teria que aprender tb PHP, JSON, HTML, CSS e outras para desenvolver. Uma linha de crescimento MUITO, mas MUITO mais lenta (por causa da quantidade de informacoes a serem assimiladas).
Quero aprender outra linguagem para ter mais "poder de fogo" em minhas solucoes E tb para avaliar se vale a pena mudar de linguagem.
Pretendo desenvolver para WEB e MOBILE, mas nao agora.

Enfim, gostei da interacao... foi muito proveitosa.
Continuem assim, pessoal. Vamos nos ajudar!

Obrigado

MuriloCunha





Em segunda-feira, 7 de julho de 2014 09h01min25s UTC-3, MuriloCunha escreveu:

Ademir Francisco da Silva

unread,
Jul 9, 2014, 10:25:58 AM7/9/14
to python...@googlegroups.com
Murilo ...

Procure no histórico desta lista pois há diversas explicações já prontas para a sua pergunta, contudo, quero lhe informar que saber o significado do "self" em Python é o básico do básico, sem ter este conhecimento consolidado não tem como se tornar um programador eficiente nesta linguagem, procure também no Tutorial do Python ..., então boa leitura ... ;-)


Ademir

PS .: Provavelmente alguém com mais tempo lhe fornecerá uma introdução ...
--
--
------------------------------------
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.

Daniel Chaves de Lima

unread,
Feb 20, 2020, 7:43:50 AM2/20/20
to Python Brasil
Fiz dessa forma (achei que ficou bom, mas carece de melhoria na estrutura do código, mas é totalmente funcional):
# coding: utf-8
from tkinter import Tk, ttk, StringVar, END, Entry

__author__
= "Daniel Chaves de Lima"
__email__ = "danielc...@gmail.com"


class Principal:
   
def __init__(self, frame):
       
self.var_nome = StringVar()
       
self.var_nome.trace("w",
                            self.maiuscula_nome)  # rastrear valor da variavel e executar funcao de validacao quando mudar

        self.en_nome = Entry(root, textvariable=self.var_nome, width=56)
       
self.en_nome.bind("<Key>", self.comparar_nome)  # rastreia as entradas
        self.en_nome.place(x=50, y=75)

   
#  tive probremas quando usava só a StringVar pois quando havia alteraçoes o cursor se movia sempre para o fim da
    #  entrada então fiz o seguinte:

    def comparar_nome(self, evento):
       
"""
            Captura a entrada 'self.en_nome' antes que o caractere seja inserido para que se possa comparar e definir
            em qual posicao houve a mudança de caractere. Tambem retorna se foi apertado backspace ou espaço.
        """
        self.comparacao1 = [self.en_nome.get(), evento.char == "\b" or evento.char == ""]

   
def maiuscula_nome(self, *args):
       
"""
            Altera em tempo real a entrada colocando-a em maiuscula.
        """
        s = self.var_nome.get().upper()
       
self.en_nome.delete(0, END)
       
self.en_nome.insert(0, s)  # caso apenas inserido um caractere no final

        # -- caso o caractere seja modificado em qualquer parte da entrada --
        if len(s) > len(self.comparacao1[0]):
            tamanho
= len(self.comparacao1[0])
       
else:
            tamanho
= len(s)

       
for i in range(tamanho):
           
if self.comparacao1[0][i] != s[i]:
               
# dependendo de qual se for digitado ou o caractere foi apagado, move o cursor pra certa posicao
                if self.comparacao1[1]:
                   
self.en_nome.icursor(i)
               
else:
                   
self.en_nome.icursor(i + 1)
               
break


root = Tk()
Principal(root)
root
.geometry("{}x{}+{}+{}".format(500, 500, 20, 20))
root
.title("ENTRY EM MAIUSCULA")
root
.mainloop()

#  caso tenha idéias para melhorar este codigo pode me contatar pelo e-mail do preambulo do código

 
Reply all
Reply to author
Forward
0 new messages