Skip to content

Instantly share code, notes, and snippets.

@CoutinhoElias
Created September 19, 2021 20:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save CoutinhoElias/7ac9cd36cec56949d5640a634f0c7c92 to your computer and use it in GitHub Desktop.
Save CoutinhoElias/7ac9cd36cec56949d5640a634f0c7c92 to your computer and use it in GitHub Desktop.
search field on KivyMD
# Vamos adicionar um campo personalizado ao nosso widget com RecycleView
# Logo acima da Screen criei um campo personalizado, ele pode estar em
# qualquer lugar do arquivo kv (desde que esteja fora dos widgets
# existentes)
# Nesse campo eu defino as propriedades comuns como cor, tamanho da fonte
# e alinhamento.
# https://kivymd.readthedocs.io/en/latest/components/textfield/#mdtextfieldround
'''
# Campo criado herdando de MDTextFieldRound
<CampoArredondado@MDTextFieldRound>:
font_size: '25sp'
normal_color: app.theme_cls.primary_dark
color_active: app.theme_cls.primary_dark
halign: 'center'
multiline: False
'''
# Abaixo a nossa Screen irei adicionar mais um Layout e dentro dele o
# nosso campo.
'''
<ScreenListItens>:
name: "list_itens"
FloatLayout:
CampoArredondado:
id: pesquisa
hint_text: 'Digite o que procura'
text_validate_unfocus: False
pos_hint: {'center_x': 0.5, 'center_y': 0.83}
size_hint: .8, .09
#on_text_validate: root.salvar()
FloatLayout:
orientation: 'vertical'
RecycleView:
id: rv
viewclass: 'ImagemComDuasLinhas'
key_size: 'height'
pos_hint: {'center_x': 0.5, 'center_y': 0.27}
RecycleBoxLayout:
padding: dp(10)
# Tamanho do retangulo com a imagem e os textos
default_size: None, dp(65)
default_size_hint: 1, None
size_hint_y: None
height: self.minimum_height
orientation: 'vertical'
'''
# Na linha 24 adicionamos mais um FloatLayout específicamente para ter
# controle no posicionamento do Widget.
# Na linha 25 adicionei nosso widget personalizado de nome CampoArredondado
# Nas linhas 26-30 definimos as propriedades particulares do campo.
# Na linha 31 podemos adicionar eventos ao validar o texto digitado.
''' ARQUIVO PYTHON'''
# Com a nossa classe ScreenListItens criada, utilizaremos somente uma consulta ao
# banco de dados conforme abaixo:
'''
p = Detalhe.select(Detalhe.dsdetalhe, Detalhe.cdprincipal) \
.order_by(Detalhe.cdprincipal)
'''
# Dentro da nossa classe ScreenListItens no arquivo .py adicionaremos
# mais uma função set_list_md_icons():
# Poderia ter feito na mesma função on_kv_post mas tornaria menos
# compreensível na explicação.
def set_list_md_icons(self, text="", search=False):
'''Builds a list of icons for the screen MDIcons.'''
self.ids.rv.data = []
for row in self.p.dicts():
if search:
if (text.upper() in row['dsdetalhe'].upper()) or (text.upper() in row['cdprincipal'].upper()):
self.ids.rv.data.append(
{
# "viewclass": "ItemImage",
# "ImageLeftWidget": choice(sample_images),
"source": './images/{}'.format(choice(self.sample_images)),
"text": row['cdprincipal'],
"secondary_text": row['dsdetalhe'],
"callback": lambda x: x,
}
)
''' EXPLICANDO O CÓDIGO ACIMA'''
# As duas funções são muito parecidas, isso explica eu ter a opção de utiliza
# apenas uma função, como disse acima foi optativo criar duas funções.
# Na linha 62 temos a consulta de dados diretamete do Postgres, essa consulta
# está dentro da classe e fora das funções para que seja reaproveitada.
# Na linha 73 esvaziamos o widget para repovoá-lo.
# Na linha 75 fazemos a comparação antes de adicioar ao Widget observe esses pontos:
# a) Na linha 76 antes de comparar as strings as converteremos em maúsculas com .upper()
# dessa maneira tanto o texto do banco de dados quanto o digitado no campo serão maiúsculo
# b) Utilizo a cláusula or (OU) para comparar com mais de um campo, assim posso
# digitar tanto descrição como código e ele pesquisará.
# Na linha 77-86 foi explicado no vídeo anterior.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment