1
resposta

PySimpleGUI , problema na função

Preciso de ajuda! Estou explorando o PySimpleGUI. Criei 2 janelas...A janela do login está funcionando perfeitamente mas assim que clico em entrar ele imprime o popup que fiz o login com sucesso ( ok ) mas a parte do codigo "" self.janela2 = lay2() self.janela.hide"" não está detectando a função lay2, e esconde a primeira pagina do login.

Alguém consegue testar e me ajudar com este erro??! Obrigado

import PySimpleGUI as sg


LOGIN1 = 'teste'
PASSWORD =  '123'

class Tela:

    sg.theme('Black')

    def __init__(self):
        ## Login ##
        layout = [
            [sg.Text('Login', size=(5,0)), sg.Input(size=(15,0), key = 'login')],
            [sg.Text('Senha', size=(5,0)), sg.Input(size=(15,0), key = 'senha', password_char='*')],
            [sg.Button('Entrar'), sg.Button('Fechar')]
        ]
        self.janela = sg.Window("BOT LUNA", layout = layout)


    def layout2(self):
        ## tela 2    
        layout2 = [
            [sg.Text('Aqui é apenas um teste', size = (5,0), key = 'teste')]
        ]
        self.janela2 = sg.Window("Testando 123", layout2 = layout2, element_justification='center')


    def iniciar(self,):
            self.window, self.button, self.values = self.janela.Read()
            self.window, self.button, self.values = self.janela2.Read()
            while True:     
                ## checar login
                if self.button == 'Entrar':
                    if self.values['login'] == LOGIN1 and self.values['senha'] == PASSWORD:
                        [sg.popup("Bem vindo ao BOT LUNA RUSH!")]
                        self.janela2 = lay2()
                        self.janela.hide


                    else:
                        [sg.popup("Usuário ou senha incorreto.")]

                ## fechar o app
                if self.button == 'Fechar' or self.button == sg.WIN_CLOSED:
                    break

            login = self.values['login']
            senha = self.values['senha']
            print(f'login: {login}')
            print(f'senha: {senha}')


tela = Tela()
tela.iniciar()
1 resposta

Olá Geovanne, tudo bem com você?

Peço desculpas pela demora no retorno.

Analisando o código apresentado, existem alguns pontos que serão necessário realizarmos algumas mudanças, deixo abaixo os tópicos com os descritivos para as mudanças.

  • Dentro do método layout2, o atributo layout do método sg.window deve ser declarado com o nome de layout no lugar de layout2, abaixo a linha com a mudança.
    sg.Window("Testando 123", layout=layout2, element_justification='center')
  • Ainda no método layout2, será necessário que o método retorne o método sg.window() no lugar de declarar um atributo.
    return sg.Window("Testando 123", layout=layout2, element_justification='center')
  • No método iniciar, devemos retirar os atributos self.window do desempacotamento do atributo self.janela.Read() e self.janela2.Read().
  • O atributo self.janela2 deverá ser declarado dentro do laço condicional if que checa se as credenciais estão corretas ou não, deverá ser atribuído a self.layout2() no lugar de lay2().

Deixo abaixo o código completo para comparação.

Código completo

import PySimpleGUI as sg


LOGIN1 = 'teste'
PASSWORD = '123'


class Tela:

    sg.theme('Black')

    def __init__(self):
        # Login
        layout = [
            [sg.Text('Login', size=(5, 0)), sg.Input(size=(15, 0), key='login')],
            [sg.Text('Senha', size=(5, 0)), sg.Input(size=(15, 0), key='senha', password_char='*')],
            [sg.Button('Entrar'), sg.Button('Fechar')]
        ]
        self.janela = sg.Window("BOT LUNA", layout=layout)

    def layout2(self):
        # tela 2
        layout2 = [
            [sg.Text('Aqui é apenas um teste', size=(5, 0), key='teste')]
        ]
        return sg.Window("Testando 123", layout=layout2, element_justification='center')

    def iniciar(self):
        self.button, self.values = self.janela.Read()

        while True:
            # checar login
            if self.button == 'Entrar':
                if self.values['login'] == LOGIN1 and self.values['senha'] == PASSWORD:
                    self.janela2 = self.layout2()
                    self.button, self.values = self.janela2.Read()
                    [sg.popup("Bem vindo ao BOT LUNA RUSH!")]
                    self.janela.hide()

                else:
                    [sg.popup("Usuário ou senha incorreto.")]

            # fechar o app
            if self.button == 'Fechar' or self.button == sg.WIN_CLOSED:
                break

        login = self.values['login']
        senha = self.values['senha']
        print(f'login: {login}')
        print(f'senha: {senha}')


tela = Tela()
tela.iniciar()

Funcionamento

Início da transcrição. GIF com o funcionamento do código apresentado acima, o código é executado na IDE Pycharm, possui layout em cores de tons de cinza, no momento do início da execução do código, todas as janelas abertas com a execução do código possuem fundo na cor preta, é aberta uma janela de login, onde o usuário informa seu login e senha, clicando no botão Entrar é aberto uma segunda janela escrito a seguinte mensagem: Aqui é apenas um teste, o usuário clica no X para fechar a janela, abrindo a terceira janela contendo a frase: Bem vindo ao BOT LUNA RUSH! O usuário clica em OK e o código encerra. Final da transcrição.

Peço que compare o código apresentado acima com o seu código e realize as mudanças nos pontos descritos e teste o código.

Fico à disposição em caso de dúvidas.

Abraços e bons estudos.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!