🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

[Pronto para Copiar e Colar] Vamos Criar um Bloco de Notas Simples com Python! (com Função de Salvar)

"Eu quero tentar construir algo tangível com programação!"

Se você se identifica, veio ao lugar certo. Neste artigo, explicarei da maneira mais simples possível como criar seu próprio "aplicativo de Bloco de Notas" simples, onde você pode digitar texto e salvá-lo em um arquivo usando a linguagem de programação Python.

Olá! Sou um desenvolvedor web autodidata que, com a ajuda da IA, comecei do zero na programação há apenas alguns meses. No início, eu estava em um nível em que pensava: "Salvar arquivo? É algum tipo de feitiço?" (risos). É exatamente por isso que quero evitar jargões o máximo possível e guiar você por este processo, compartilhando os pontos em que tropecei como um colega iniciante.

O objetivo deste artigo é simples: fazer você experimentar a emoção de "meu próprio programa está funcionando!". Para isso, vamos deixar as partes difíceis para depois! Primeiro, vamos copiar, colar e interagir com o produto finalizado!


PASSO 1: Vamos executar agora mesmo! Aqui está o código completo

Ver para crer. Primeiro, copie todo o código abaixo, salve-o como memo_app.py e tente executá-lo. Se você não tem um ambiente Python configurado, por favor, prepare isso primeiro.

Se você está pensando "O quê, já o código final?" ou "Onde está a explicação?", você está no caminho certo! Experimentar o "funciona" primeiro é o segredo para tornar a programação divertida.


import tkinter as tk
import tkinter.filedialog as filedialog

def save_file():
    """Função para salvar um arquivo"""
    file_path = filedialog.asksaveasfilename(
        defaultextension=".txt",
        filetypes=[("Arquivos de Texto", "*.txt"), ("Todos os Arquivos", "*.*")]
    )
    if not file_path:
        return
    try:
        with open(file_path, 'w', encoding='utf-8') as file:
            text_content = text_area.get(1.0, tk.END)
            file.write(text_content)
    except Exception as e:
        print(f"Ocorreu um erro: {e}")

def open_file():
    """Função para abrir um arquivo"""
    file_path = filedialog.askopenfilename(
        filetypes=[("Arquivos de Texto", "*.txt"), ("Todos os Arquivos", "*.*")]
    )
    if not file_path:
        return
    try:
        with open(file_path, 'r', encoding='utf-8') as file:
            text_content = file.read()
            text_area.delete(1.0, tk.END)
            text_area.insert(tk.END, text_content)
    except Exception as e:
        print(f"Ocorreu um erro: {e}")

# Criar a janela principal
window = tk.Tk()
window.title("Bloco de Notas Simples")
window.geometry("600x400")

# Criar a área de entrada de texto
text_area = tk.Text(window, wrap=tk.WORD)
text_area.pack(expand=True, fill=tk.BOTH)

# Criar a barra de menu
menu_bar = tk.Menu(window)
window.config(menu=menu_bar)

# Criar o menu "Arquivo"
file_menu = tk.Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="Arquivo", menu=file_menu)
file_menu.add_command(label="Abrir...", command=open_file)
file_menu.add_command(label="Salvar como...", command=save_file)
file_menu.add_separator()
file_menu.add_command(label="Sair", command=window.quit)

# Exibir a janela
window.mainloop()
    

Como foi? Se você vir uma janela como esta, foi um grande sucesso!

Captura de tela de um aplicativo de bloco de notas simples criado com Python. Há um menu 'Arquivo' na parte superior da janela e uma grande área de entrada de texto no centro.

Tente digitar algum texto ou selecionar "Salvar como..." ou "Abrir..." no menu. Não é um pouco emocionante que ele realmente funcione como um bloco de notas?


PASSO 2: Explorando o Código! Vamos espiar como funciona

Agora que você experimentou o momento "funcionou!", vamos explorar "por que funciona?". Vamos dividir o código anterior em partes e explicar o papel de cada uma.

① Preparando a Caixa de Ferramentas Mágica (import)

As duas primeiras linhas do código são como um passe de mágica para carregar as "ferramentas úteis" que vamos usar no Python.


import tkinter as tk
import tkinter.filedialog as filedialog
    

② Construindo a Base do Aplicativo (Criação da Janela)

Em seguida, criamos a janela principal para o nosso aplicativo. Em termos de construção de uma casa, isso é como a fundação e a estrutura.


# Criar a janela principal
window = tk.Tk()
window.title("Bloco de Notas Simples")
window.geometry("600x400")

# ... (código omitido) ...

# Exibir a janela
window.mainloop()
    

③ Preparando um Lugar para Escrever (Área de Texto)

É um bloco de notas, então, claro, precisamos de um espaço para digitar texto. É esta parte que o cria.


# Criar a área de entrada de texto
text_area = tk.Text(window, wrap=tk.WORD)
text_area.pack(expand=True, fill=tk.BOTH)
    

④ Criando Caixas de Comandos (Funções)

Finalmente, chegamos ao coração deste aplicativo: os processos específicos para "Abrir Arquivo" e "Salvar Arquivo". Esses processos são definidos como funções, que são como "caixas úteis que agrupam comandos".

Salvando um Arquivo: A Função `save_file()`


def save_file():
    """Função para salvar um arquivo"""
    file_path = filedialog.asksaveasfilename(
        defaultextension=".txt",
        filetypes=[("Arquivos de Texto", "*.txt"), ("Todos os Arquivos", "*.*")]
    )
    if not file_path:
        return
    try:
        with open(file_path, 'w', encoding='utf-8') as file:
            text_content = text_area.get(1.0, tk.END)
            file.write(text_content)
    except Exception as e:
        print(f"Ocorreu um erro: {e}")
    

Este código está repleto de pontos importantes.

  1. `filedialog.asksaveasfilename(...)`: Este é o comando que exibe a caixa de diálogo "Salvar como". O caminho do local de salvamento escolhido pelo usuário (como um endereço que leva ao nome do arquivo) é armazenado em uma variável chamada `file_path`.
  2. `if not file_path: return`: Se o usuário clicar em "Cancelar" na caixa de diálogo, `file_path` ficará vazio. Esta é uma linha crucial que simplesmente sai da função sem fazer nada nesse caso.
  3. `with open(file_path, 'w', encoding='utf-8') as file:`: Esta é a chave para a E/S de arquivos!
    • `open()`: Um comando para abrir o arquivo no caminho especificado no modo especificado.
    • `'w'`: Significa modo de `escrita` (`write`). Se o arquivo não existir, ele é criado. Se existir, é sobrescrito.
    • `encoding='utf-8'`: Um feitiço super importante para evitar texto corrompido. Ele especifica "UTF-8", uma codificação de caracteres padrão que pode lidar corretamente com a maioria dos idiomas do mundo. Sem isso, caracteres não ingleses podem não ser salvos corretamente.
    • `with ... as file:`: Usar esta sintaxe garante que o arquivo seja fechado automaticamente após o término do bloco de código. Esquecer de fechar um arquivo pode causar problemas como vazamentos de memória, então esta é uma maneira muito segura e recomendada de escrever código. (Também recomendado na documentação oficial)
  4. `text_area.get(1.0, tk.END)`: Isso obtém todo o texto atualmente na área de texto.
  5. `file.write(text_content)`: Isso escreve o texto recuperado no arquivo aberto.

Da mesma forma, a função `open_file()` apenas usa `'r'` (modo de leitura) para ler o conteúdo de um arquivo e exibi-lo na área de texto. O mecanismo é quase idêntico!


PASSO 3: Edição Avançada! Vamos personalizar seu Bloco de Notas

Agora que você entende a mecânica básica, vamos torná-la mais interessante! Você pode implementar recursos úteis apenas adicionando um pouco de código.

Personalização 1: Criar um Design estilo Modo Escuro

O modo escuro está na moda. Vamos mudar o design para ser mais agradável aos olhos. Você só precisa especificar as cores de fundo e de primeiro plano onde cria a `window` e a `text_area`.


# Criar a janela principal
window = tk.Tk()
window.title("Bloco de Notas Escuro")
window.geometry("600x400")
window.config(bg="#2d2d2d") # Adicionar a cor de fundo da janela

# Criar a área de entrada de texto
text_area = tk.Text(
    window, 
    wrap=tk.WORD,
    bg="#1e1e1e",          # Cor de fundo da área de texto
    fg="#dcdcdc",          # Cor do texto
    insertbackground="#ffffff" # Cor do cursor
)
text_area.pack(expand=True, fill=tk.BOTH)
    

Apenas com isso, ele ganha uma aparência muito mais moderna, não é?


Personalização 2: Adicionar Atalhos de Teclado

Abrir o menu toda vez é um incômodo, certo? Vamos fazer com que você possa salvar com "Ctrl + S" e abrir com "Ctrl + O". Ao adicionar itens ao menu, especificaremos o atalho com `accelerator` e, em seguida, usaremos `window.bind` para conectar o pressionamento de tecla real à função.

Primeiro, mude a parte de criação do menu assim:


# Criar o menu "Arquivo"
file_menu = tk.Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="Arquivo", menu=file_menu)
# Usar accelerator para exibir uma dica para o atalho
file_menu.add_command(label="Abrir...", command=open_file, accelerator="Ctrl+O")
file_menu.add_command(label="Salvar como...", command=save_file, accelerator="Ctrl+S")
file_menu.add_separator()
file_menu.add_command(label="Sair", command=window.quit)
    

Em seguida, adicione o código para vincular os pressionamentos de tecla às funções logo antes de `window.mainloop()`.


# Vincular atalhos de teclado
# Usar lambda para lidar com o argumento do evento
window.bind("<Control-s>", lambda event: save_file())
window.bind("<Control-o>", lambda event: open_file())

# Exibir a janela
window.mainloop()
    

O método `bind` chama uma função quando um evento ocorre (neste caso, um pressionamento de tecla) e, ao fazê-lo, passa informações sobre o evento (o objeto `event`) como um argumento. No entanto, nossas funções `save_file` e `open_file` não foram projetadas para aceitar argumentos. Então, ao usar `lambda event:`, estamos criando um intermediário que ignora o argumento e chama nossa função desejada. É um pequeno truque bacana!


Pontos de Atenção (Uma Palavra de Cautela)

Operações de arquivo são uma fonte comum de erros inesperados. Eu também fiquei olhando para telas de erro e quebrando a cabeça muitas vezes no início... Apenas saber sobre os erros comuns pode ajudá-lo a não entrar em pânico.

Em nosso código, usamos um bloco `try...except` para capturar erros, então, mesmo que ocorra um erro, o aplicativo não irá travar, e uma mensagem de erro será exibida no console. Esta é outra técnica importante para construir programas robustos.


Conclusão: Um Pequeno Sucesso é um Grande Passo Adiante

Ótimo trabalho! Neste artigo, usamos o `Tkinter` do Python para criar um aplicativo de bloco de notas simples com um recurso de salvamento de arquivos.

Você conseguiu experimentar, começando pelo copiar e colar, entendendo o mecanismo e, finalmente, personalizando-o você mesmo? A experiência de "ver o código que escrevi funcionar de forma visível" é uma alegria sem igual e é a melhor motivação para continuar aprendendo a programar.

O aplicativo que construímos hoje é apenas o começo. Você pode adicionar inúmeros recursos dependendo de suas ideias, como uma função de busca, contagem de palavras ou salvamento automático. Por favor, use este artigo como base e tente desenvolver seu próprio aplicativo original!

Para o Próximo Passo

Agora que você entendeu o básico dos aplicativos GUI, que tal tentar manipular o "tempo" a seguir? No próximo artigo, explicaremos como usar o módulo `time` do Python para criar um aplicativo de timer que o notifica em um horário especificado. Vamos nos desafiar a construir ferramentas úteis do dia a dia, como alarmes e temporizadores Pomodoro!

→ Vamos Criar um Aplicativo de Timer com Python (módulo time)

Bônus: O Código Python Completo e Pronto para Executar

Aqui está o código Python final e completo que incorpora todos os exemplos discutidos neste artigo, incluindo o design estilo modo escuro и os atalhos de teclado. Basta copiar e colar isto, e você terá um aplicativo de bloco de notas rico em recursos pronto para usar instantaneamente!

<?php
/*
Este é um script Python, não um arquivo PHP para ser executado em um servidor web.
Por favor, mude a extensão para .py e execute-o com um interpretador Python.
Exemplo: python seu_nome_de_arquivo.py
*/
?>
import tkinter as tk
import tkinter.filedialog as filedialog

def save_file():
    """Função para salvar o arquivo"""
    file_path = filedialog.asksaveasfilename(
        defaultextension=".txt",
        filetypes=[("Arquivos de Texto", "*.txt"), ("Todos os Arquivos", "*.*")]
    )
    if not file_path:
        return
    try:
        with open(file_path, 'w', encoding='utf-8') as file:
            text_content = text_area.get(1.0, tk.END)
            file.write(text_content)
    except Exception as e:
        # Idealmente, isso seria registrado em um log ou o usuário seria notificado com um diálogo
        print(f"Ocorreu um erro: {e}")
        window.title(f"Erro: {e}")


def open_file():
    """Função para abrir um arquivo"""
    file_path = filedialog.askopenfilename(
        filetypes=[("Arquivos de Texto", "*.txt"), ("Todos os Arquivos", "*.*")]
    )
    if not file_path:
        return
    try:
        with open(file_path, 'r', encoding='utf-8') as file:
            text_content = file.read()
            text_area.delete(1.0, tk.END)
            text_area.insert(tk.END, text_content)
            window.title(f"Bloco de Notas - {file_path}")
    except Exception as e:
        print(f"Ocorreu um erro: {e}")
        window.title(f"Erro: {e}")


# --- Configuração da GUI ---

# Criar la janela principal
window = tk.Tk()
window.title("Bloco de Notas Avançado")
window.geometry("800x600")
window.config(bg="#2d2d2d") # Cor de fundo da janela

# Criar a área de entrada de texto
text_area = tk.Text(
    window,
    wrap=tk.WORD,
    bg="#1e1e1e",          # Cor de fundo da área de texto
    fg="#dcdcdc",          # Cor do texto
    insertbackground="#ffffff", # Cor do cursor (branco para melhor visibilidade)
    undo=True,             # Ativar a função Desfazer/Refazer
    autoseparators=True
)
text_area.pack(expand=True, fill=tk.BOTH, padx=5, pady=5)


# Criar a barra de menu
menu_bar = tk.Menu(window)
window.config(menu=menu_bar)

# Criar o menu "Arquivo"
file_menu = tk.Menu(menu_bar, tearoff=0, bg="#2d2d2d", fg="#dcdcdc")
menu_bar.add_cascade(label="Arquivo", menu=file_menu)
file_menu.add_command(label="Abrir...", command=open_file, accelerator="Ctrl+O")
file_menu.add_command(label="Salvar como...", command=save_file, accelerator="Ctrl+S")
file_menu.add_separator()
file_menu.add_command(label="Sair", command=window.quit)

# Vincular atalhos de teclado (usando lambda para ignorar o argumento do evento)
window.bind("<Control-s>", lambda event: save_file())
window.bind("<Control-o>", lambda event: open_file())
window.bind("<Control-S>", lambda event: save_file()) # Também lida com o pressionamento simultâneo da tecla Shift
window.bind("<Control-O>", lambda event: open_file()) # Também lida com o pressionamento simultâneo da tecla Shift

# Iniciar o loop de eventos principal da janela
window.mainloop()