Kivy - Labels que se adaptam ao conteúdo!
Nesse vídeo vamos aprender a criar um Label que muda seu tamanho e quebra a linha do texto automaticamente.
Normalmente um label mostra todo seu conteúdo em uma linha só. Para textos bem pequenos isso não é um problema. Mas caso você queira mostrar algo com mais conteúdo, algumas modificações terão que ser feitas para que ocorra a quebra de linha automática e para que o tamanho do widget se ajuste ao conteúdo.
Toda vez que criamos um texto no kivy, ele converte o texto para uma imagem e atribui essa imagem ao widget. Essa imagem criada pelo kivy com o texto chamamos de textura.
O Label possui uma propriedade que indica para o kivy a área que o texto deve ocupar. Então para que haja a quebra de linha automática, precisamos limitar essa área para que o kivy mostre o resto do texto nas linhas seguintes.
Vamos criar uma classe MeuLabel que terá quebra de linha automática:
class MeuLabel(Label):
def __init__(self,**kwargs):
super().__init__(**kwargs)
self.size_hint = (1, None)
Essa classe herda da classe 'Label' e na inicialização colocamos a propriedade size_hint para 1, na largura e None na altura. Ou seja, a largura do widget será controlada pelo layout e a altura vamos colocar "manualmente".
A propriedade text_size do 'Label' diz a área em que o kivy deve criar o texto. Essa área muda conforme o tamanho do widget e o conteúdo. A largura do text_size pode ser atrelada a largura do widget e, como não sabemos o tamanho do conteúdo, vamos colocar None na altura.
def on_size(self,*args):
# vamos colocar um espaço de 10 sp
self.text_size = (self.width - sp(10), None)
Agora o kivy já sabe a largura que vai desenhar o texto. Ele vai ir colocando as palavras até que a largura máxima do text_size seja alcançada. Depois ele pula para a linha debaixo e repete o processo. Como colocamos None, ele vai pular quantas linhas forem necessárias.
Depois que o kivy criou a textura do texto, agora temos acesso a altura do texto. Então vamos alterar o tamanho do widget para armazenar esse texto.
def on_texture_size(self,*args):
self.size = self.texture_size
# vamos colocar um espaço a mais de 20sp
self.height += sp(20)
E assim criamos um Label que se adapta ao conteúdo!
Confira o vídeo para mais dicas e a implementação desse label no nosso aplicativo!
Faça o download dos arquivos desta aula aqui.