3
respostas

"IndexError: list index out of range" - Texto formatado no input

Prezados,

Elaborei um código que encontra elementos de uma "string" com formatação específica.

Ocorre que a origem do texto é um formulário ".jfs" que encontra-se formatado.

Quando copio (Ctrl+C) e colo (Ctrl+V) o texto no "input" do código surge o seguinte erro:

Traceback (most recent call last):
  File "C:\Users\yuri-\PycharmProjects\TratamentoSICAR\main.py", line 20, in <module>
    numero = argumento.ExtraiNumeroInscricaoSICAR()
  File "C:\Users\yuri-\PycharmProjects\TratamentoSICAR\ExtratorAtributosInscricao.py", line 36, in ExtraiNumeroInscricaoSICAR
    return ", ".join(numero[0:-1]) + " e " + "".join(numero[-1])
IndexError: list index out of range

O erro em questão surge imediatamente. Não preciso nem apartar o "Enter" para fazer o programa voltar a rodar.

Vale ressaltar que, quando faço um tratamento prévio do texto no word, substituindo as "Marcas de Parágrafo" por espaços simples, o código funciona perfeitamente.

Assim, pergunto se há alguma forma de evitar o referido erro , fazendo o "input" receber esse texto diretamente sem formatação, o que seria ideal.

Por outro lado, caso não exista solução, seria possível fazer o programa abrir, automaticamente, uma janela do "Bloco de Notas" (Windows 10) para que eu consiga colar o texto no referido arquivo visando contornar o problema usando um "readlines"? Seria possivel, ao fechar o arquivo .txt e fazer o programa seguir com a tarefa de buscar as "strings" específicas do texto de forma automática?

Qualquer sujestão é bem-vinda.

Desde já, agradeço.

3 respostas

Fiz uma espécie de bloco de notas usando o tkinter. Veja se serve para você.

from tkinter import *
from tkinter.scrolledtext import *

class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack(expand=1, fill=BOTH)
        self.create_widgets()

    def create_widgets(self):
        self.button = Button(self)
        self.button["text"] = "Imprimir no console"
        self.button["command"] = self.print_contents
        self.button.pack(side="top")

        self.text_area = ScrolledText(self, font=("Arial", 14))
        self.text_area.pack(expand=1, fill=BOTH)

    def print_contents(self):
        print(self.text_area.get("1.0", END))

root = Tk()
app = Application(master=root)
app.mainloop()

Obrigado pela ajuda!

Ainda estou enganinhando no python. Não conhecia a biblioteca tkinter. Dei uma olhada em como funciona e tentei aplicar seu código no meu programa.

O problema é que nao estou conseguindo substituir o "print" por um "return" na função "print_contentes". Na verdade eu tenho que mandar o resultado dessa captura de texto pro meu "main", para que o restante de meu programa rode. A ideia é pegar a "string" gerada, fatiar e pegar alguns dados automaticamente.

Eu fiz o seguinte:

    def print_contents(self):
        texto = self.text_area.get("1.0", END)
        formato = re.compile("\n")
        texto2 = formato.sub(" ", texto)
        return texto2

Acrescentei essa variável "formato" somente pra excluir quebras de linha. Então criei a variável "texto2" só para efetivar o "return" (sei que o código pode ser resumido, mas quero deixar bem claro o caminho adotado), mas não dá certo.

Resumindo, como pegar esse texto incluido nesse programa front-end do tkinter e aproveita-lo no "main"?

Desde já, agradeço a ajunda.

Para aproveitar o texto no main só após destruir a janela. Consegui fazer sem precisar de apertar botão, mas o código ficou bagunçado:

from tkinter import *
from tkinter.scrolledtext import *

class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack(expand=1, fill=BOTH)
        self.create_widgets()

    def create_widgets(self):
        self.text_area = ScrolledText(self, font=("Arial", 14))
        self.text_area.pack(expand=1, fill=BOTH)

    def print_contents(self):
        global texto
        texto = self.text_area.get("1.0", END)

root = Tk()
app = Application(master=root)

def on_closing():
    global texto
    texto = app.text_area.get("1.0", END)
    root.destroy()

root.protocol("WM_DELETE_WINDOW", on_closing)
app.mainloop()

formato = re.compile("\n")
texto2 = formato.sub(" ", texto)
print(texto2)