maiconrp / estacao-meteorologica

Espaço de código para um projeto IoT que visa o monitoramento da irrigação por meio de dados climatológicos
7 stars 0 forks source link

[HELP]: Múltiplos valores para um argumento e argumento posicional. #2

Closed Voctor-367 closed 1 year ago

Voctor-367 commented 1 year ago

Descrição

O erro TypeError: init() got multiple values for argument 'margin' ocorre porque se passa o argumento margin duas vezes ao criar uma instância da classe ContainerTemplate. Isso pode acontecer se você passar o mesmo argumento duas vezes ou se você passar um argumento que já foi definido como um argumento padrão no método init(). O argumento margin já é definido como um argumento padrão no método init(). Portanto, quando se passa margin=50 novamente, o Python interpreta que o argumento margin foi passado duas vezes.

No entanto, se você deseja manter o margin=50 ao criar a instância Irrigacao, pode modificá-lo para que seja passado como um argumento posicional, em vez de um argumento de palavra-chave. Caso os demais argumentos tamb´´em sejam passados ao construtor de forma posicional, teríamos :

Exemplo:

Irrigacao = ContainerTemplate( ft.Row([IrrigacaoTitle, IconTime]),

ft.Row([ContainerTemplate(
    content=ft.Text("1h30", color='#000000', weight=ft.FontWeight.W_300),
)]),

ft.Row([IrrigacaoTitle]),

50,  # argumento posicional para margin
10,  # argumento posicional para padding
ft.alignment.center,  # argumento posicional para alignment
'white',  # argumento posicional para bgcolor
150,  # argumento posicional para width
150,  # argumento posicional para height
10,  # argumento posicional para border_radius

)

Vale ressaltar que o construtor de ContainerTemplate possui 9 argumentos, e se ultrapassar esse número, um novo erro ocorre,

Código relevante

import flet as ft
from flet import UserControl

class ContainerTemplate(UserControl):
    def __init__(
        self, 
        content=ft.Text("Non clickable"),
        margin=None,
        padding=None,
        alignment=None,
        bgcolor=None,
        width=None,
        height=None,
        border_radius=None
    ):

        # Metodo init
        super().__init__()
        self.content=content
        self.margin=margin
        self.content=content
        self.margin=margin
        self.padding=padding
        self.alignment=alignment
        self.bgcolor=bgcolor
        self.border_radius=border_radius 

    def build(self):
        return ft.Container(
            content=self.content,
            margin=self.margin,
            padding=self.padding,
            alignment=self.alignment,
            bgcolor=self.bgcolor,
            width=self.width,
            height=self.height,
            border_radius=self.border_radius,
        )

IrrigacaoTitle = ContainerTemplate(
            content=ft.Text("Irrigação", color='#000000'),
            margin=10,
            padding=10,
            alignment=ft.alignment.center,  
            bgcolor='#EBEBF0',          
            width=70,
            height=20,
            border_radius=20,
            )

IconTime = ContainerTemplate(
            content=ft.Icon(name=ft.icons.WATCH_LATER, color='#00d154', size=30),
            )

Irrigacao = ContainerTemplate(
            ft.Row(
                        [
                            IrrigacaoTitle, 
                            IconTime, 
                        ]
                    ),

            margin=50,
            padding=50,
            alignment=ft.alignment.center,
            bgcolor='white',
            width=150,
            height=150,
            border_radius=10,
            )

Evapotranspiracao = ContainerTemplate(
                content=ft.Text("Non clickable"),
                bgcolor='white',
            )

Economia = ContainerTemplate(
                content=ft.Text("Non clickable"),
                alignment=ft.alignment.center,
                bgcolor='white',
            )

Mensagem de erro

TypeError: init() got multiple values for argument 'margin'

maiconrp commented 1 year ago

Erro ocorre devido à uma repetição desnecessaria em:

# Metodo init
self.content=content
self.margin=margin
self.content=content
self.margin=margin

Assim, vc atribue dois margin e dois content, ou seja, multiplos valores.

Remova a duplicata e o codigo funcionará