1
resposta

PySimpleGUI e tabela - como exibir dados CSV

Boa tarde! A situação é que na interface gráfica lista_viagens( ) funciona, mas não aparecem os dados que cadastro e salvo como CSV. Criei a função listar( ) que está listando normalmente, só não consigo fazer a lista aparecer na tabela da interface "Lista de viagens". Como posso fazer para que as informações cadastradas apareçam na tela "Lista de viagens"?

import PySimpleGUI as sg
import os
import csv
cwd = os.getcwd()
print("Current working directory is:", cwd)

#============================== Persistência ======================================
def grava_dados(viagens):
    arquivo = open('viagens.csv', 'a+')
    municipio = viagens['municipio']
    estado = viagens['estado']
    atividades = viagens['atividades']
    arquivo.write(municipio + ", " + estado + ", " + atividades + "\n")
    print('GRAVOU O ARQUIVO')
    arquivo.close()

#============================== Tela inicial ======================================
def tela_inicial():
    sg.theme('DarkTeal3')
    layout = [
              [sg.Text("Cadastro de viagens", font="Arial 16 bold", pad=(25, 30))],
              [sg.Button("Cadastro", key="cadastro", size=(40, 2))],
              [sg.Button("Consulta", key="consulta", size=(40, 2))]
             ]

    janela = sg.Window("Tela inicial", layout, text_justification="center")
    botao, valores = janela.read()
    janela.close()
    return botao

# tela_inicial()
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~CADASTRO~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def cadastra():
    sg.theme('DarkTeal3')
    layout = [
              [sg.Text("Cadastre sua viagem!", font=("Arial 16 bold"), pad=(20, 30))],
              [sg.Text("Município", size=(10,1)), sg.Input(key="municipio", size =(40, 1))],
              [sg.Text("Estado", size=(10,1)), sg.Input(key="estado", size =(40, 1))],
              [sg.Text("Atividades", size=(10,1)), sg.Input(key="atividades", size =(40, 1))],
              [sg.Button("Cadastrar", key = "cadastrar", size=(23, 2)), sg.Button("Voltar", key = "voltar", size=(24,2))]
              ]

    janela = sg.Window("Cadastro", layout)
    botao, valores = janela.read()
    janela.close()
    if botao == 'cadastrar':
        grava_dados(valores)
    elif botao == 'voltar':
        tela_inicial()


# cadastra()

#~~~~~~~~~~~~~~~~~~~~~~~~~~~tabela~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def lista_viagens():
    sg.theme('DarkTeal3')
    layout = [
        [sg.Text("Lista de viagens", font=("Arial 16 bold"), pad=(20, 30))],
        [sg.Table([['municipio', 'estado', 'atividades']], num_rows=3)],
        [sg.Button("Voltar", key="voltar", size=(24, 2))]
            ]
    janela = sg.Window("Lista de viagens", layout)
    botao, valores = janela.read()
    janela.close()
    if botao == 'voltar':
        tela_inicial()

def listar():
    with open('viagens.csv', encoding='utf-8') as arquivo_referencia:
        # 2. ler a tabela
        tabela = csv.reader(arquivo_referencia, delimiter=',')
        print('entrei')
        # 3. navegar pela tabela
        for l in tabela:
            municipio = l[0]
            estado = l[1]
            ativ = l[2]

            print(municipio, estado, ativ)



# lista_viagens()
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Buttons come to life~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def main():
    sg.theme('DarkTeal3') #Define um tema para o PySimpleGUI

    while True:
        opcao = tela_inicial()
        try:
            match opcao:
                case 'cadastro':  # Inclui
                    cadastra()
                case 'consulta':
                    lista_viagens()
                    listar()
                case _:
                    grava_dados()#quando adciono isso consigo fechar a tela_inicial
                    break

        except SystemExit: # Garante que caso uma janela seja fechada, os dados ainda serão gravados no arquivo
            exit() #Fecha o programa pythons

main()
1 resposta

Olá Thaissa, tudo bem com você?

Peço desculpas pela demora em obter um retorno.

O código atualmente lista as informações no console usando o print(), mas não as exibe na tabela da interface gráfica. Para resolver esse problema e exibir as informações da lista na tabela da interface, você pode seguir as seguintes etapas:

  • Modifique a função listar() para retornar a lista de viagens ao invés de imprimir no console.

  • Na função lista_viagens(), após a criação da tabela, atualize os dados da tabela com as informações retornadas pela função listar():

  • Atualize a chamada da função listar() dentro da opção consulta na função main() para armazenar a lista de viagens em uma variável e passe essa lista de viagens para a função lista_viagens() para exibir na tabela:

Abaixo, o gif contendo o resultado das alterações ditas acima:

Código completo alterado:

import PySimpleGUI as sg
import os
import csv
cwd = os.getcwd()
print("Current working directory is:", cwd)


def grava_dados(viagens):
    arquivo = open('viagens.csv', 'a+', encoding='utf-8')
    municipio = viagens['municipio']
    estado = viagens['estado']
    atividades = viagens['atividades']
    arquivo.write(municipio + ", " + estado + ", " + atividades + "\n")
    print('GRAVOU O ARQUIVO')
    arquivo.close()


def tela_inicial():
    sg.theme('DarkTeal3')
    layout = [
        [sg.Text("Cadastro de viagens", font="Arial 16 bold", pad=(25, 30))],
        [sg.Button("Cadastro", key="cadastro", size=(40, 2))],
        [sg.Button("Consulta", key="consulta", size=(40, 2))]
    ]

    janela = sg.Window("Tela inicial", layout, text_justification="center")
    botao, valores = janela.read()
    janela.close()
    return botao


def cadastra():
    sg.theme('DarkTeal3')
    layout = [
        [sg.Text("Cadastre sua viagem!", font=("Arial 16 bold"), pad=(20, 30))],
        [sg.Text("Município", size=(10, 1)), sg.Input(
            key="municipio", size=(40, 1))],
        [sg.Text("Estado", size=(10, 1)), sg.Input(
            key="estado", size=(40, 1))],
        [sg.Text("Atividades", size=(10, 1)), sg.Input(
            key="atividades", size=(40, 1))],
        [sg.Button("Cadastrar", key="cadastrar", size=(23, 2)),
         sg.Button("Voltar", key="voltar", size=(24, 2))]
    ]

    janela = sg.Window("Cadastro", layout)
    botao, valores = janela.read()
    janela.close()
    if botao == 'cadastrar':
        grava_dados(valores)
    elif botao == 'voltar':
        tela_inicial()


def listar():
    viagens = []
    with open('viagens.csv', encoding='utf-8') as arquivo_referencia:
        tabela = csv.reader(arquivo_referencia, delimiter=',')
        for l in tabela:
            municipio = l[0]
            estado = l[1]
            ativ = l[2]
            viagem = [municipio, estado, ativ]
            viagens.append(viagem)
    return viagens


def lista_viagens(dados):
    sg.theme('DarkTeal3')
    layout = [
        [sg.Text("Lista de viagens", font=("Arial 16 bold"), pad=(20, 30))],
        [sg.Table(values=dados, headings=['Município', 'Estado',
                  'Atividades'], auto_size_columns=True, num_rows=10)],
        [sg.Button("Voltar", key="voltar", size=(24, 2))]
    ]
    janela = sg.Window("Lista de viagens", layout)
    botao, valores = janela.read()
    janela.close()
    if botao == 'voltar':
        tela_inicial()


def main():
    sg.theme('DarkTeal3')

    while True:
        opcao = tela_inicial()
        try:
            match opcao:
                case 'cadastro':
                    cadastra()
                case 'consulta':
                    viagens = listar()
                    lista_viagens(viagens)
                case _:
                    grava_dados()
                    break

        except SystemExit:
            exit()


main()

GIF contendo a execução do código apresentado abaixo deste GIF

Espero ter ajudado. Continue mergulhando em conhecimento!

Abraços e bons estudos!

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