Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Problema com o PySimpleGUI

Olá, estava procurando alguma forma de criar uma UI com python e encontrei o PySimpleGUI. Baixei a lib e comecei a fazer os testes. Fiz um código simples, onde as informações eram capturadas e quando o botão de save fosse clicado o conteúdo seria escrito em um arquivo. O problema é que não funcionou, mas não entendi o porquê, pois o arquivo era criado, mais as informações não eram escritas. Tentei dar um flush() ao abrir e mais um depois de escrever e nada, segue o código:

import PySimpleGUI as sg

sg.theme('DarkAmber')

file="salve.png"
cancel="cancel.png"

layout = [ [sg.Text("PyTest", font=("Helvetica", 25))],
    [sg.Text("Nome do arquivo"), sg.InputText(size=(30,90))],
            [sg.Output(size=(190,50),key='-OUTPUT-')],
            [sg.Button('`', image_filename=file, image_size=(35, 35), image_subsample=4),
             sg.Button(" ", image_filename=cancel, image_size=(100,30), image_subsample=1),
             sg.Button("Clear")],
]

window = sg.Window('PyTest', layout, no_titlebar=True).Finalize()
window.Maximize()

while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED or event == ' ': # if user closes window or clicks cancel
        print(values[0])
        break
    if event == 'Clear':
        window['-OUTPUT-'].update('')
        continue
    if event == "`":
        arq = open(values[0], 'w')
        arq.write(values[1])
        arq.flush()
        continue

Uma pequena observação: quando eu tento imprimir qualquer coisa no console, seja no início, no final ou dentro de uma condicional, nada acontece, caso isso indique algum problema. Caso alguém responda ficarei grato.

3 respostas

Olá, após procurar e realizar alguns testes descobri que o problema era que o Output não poderia ter seu valor capturado, mas precisaria de alguma forma em que eu pudesse criar uma caixa de input mais larga em que eu pudesse capturar seus valores, como eu poderia realizar isso?

solução!

Oi Cauê, como você está? Espero que esteja tudo bem por ai ^-^

Cara, você pode utilizar o Multiline ao invés do Output. Com o Multiline você teria algo simular a uma caixa de texto e como ele retorna um dicionário, basta especificar uma chave para acesso posterior. Em código teremos algo assim:

sg.Multiline(size=(190,40),key='texto_do_arquivo')

E para acessar, faremos: values['texto_do_arquivo']

Se me permite, uma melhoria no seu código seria adicionar a extensão do arquivo no próprio código, dessa forma, o usuário só precisará digitar o nome do arquivo. Também, é interessante especificar o tipo de codificação do arquivo para que não apareça caracteres estranhos em caso de acentuação. Por exemplo:

arq = open(values[0] + ".txt", 'w', encoding='utf-8')

Segue abaixo o código completo com as alterações:

import PySimpleGUI as sg

sg.theme('DarkAmber')

file="salve.png"
cancel="cancel.png"

layout = [ [sg.Text("PyTest", font=("Helvetica", 25))],
    [sg.Text("Nome do arquivo"), sg.InputText(size=(30,90))],
            [sg.Multiline(size=(190,40),key='texto_do_arquivo')],
            [sg.Button('`', image_filename=file, image_size=(35, 35), image_subsample=4),
             sg.Button(" ", image_filename=cancel, image_size=(100,30), image_subsample=1),
             sg.Button("Clear")],
]

window = sg.Window('PyTest', layout, no_titlebar=True).Finalize()
window.Maximize()

while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED or event == ' ': # if user closes window or clicks cancel
        print(values[0])
        break
    if event == 'Clear':
        window['-OUTPUT-'].update('')
        continue
    if event == "`":
        arq = open(values[0] + ".txt", 'w', encoding='utf-8')
        arq.write(values['texto_do_arquivo'])
        arq.flush()
        print("Arquivo salvo com sucesso!")
        break

Qualquer dúvida é só falar, tá bom? Estou por aqui.

Abraços!

Olá Nádia, muito obrigado! Realmente havia procurado bastante nos docs da lib e não tinha achado nada que conseguisse implementar minhas ideias. E obrigado por dar uma dica da melhora do código, realmente simplifica e melhora a performance ^-^

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software