Pitão

Como escrever um editor de texto simples no PyQt5

Como escrever um editor de texto simples no PyQt5
Este artigo cobrirá um guia sobre a criação de um editor de texto simples em Python3 e PyQt5. Qt5 é um conjunto de bibliotecas de plataforma cruzada escritas em C ++, usadas principalmente para criar aplicativos gráficos ricos. PyQt5 fornece ligações Python para a versão mais recente do Qt5. Todos os exemplos de código neste artigo são testados com Python 3.8.2 e PyQt5 versão 5.14.1 no Ubuntu 20.04.

Instalando PyQt5 no Linux

Para instalar o PyQt5 na versão mais recente do Ubuntu, execute o comando abaixo:

$ sudo apt install python3-pyqt5

Se você estiver usando qualquer outra distribuição Linux, procure o termo “Pyqt5” no gerenciador de pacotes e instale-o a partir daí. Como alternativa, você pode instalar o PyQt5 a partir do gerenciador de pacotes pip usando o comando abaixo:

$ pip install pyqt5

Observe que, em algumas distribuições, pode ser necessário usar o comando pip3 para instalar corretamente o PyQt5.

Código Completo

Estou postando o código completo de antemão para que você possa entender melhor o contexto de snippets de código individuais explicados posteriormente neste artigo. Se você estiver familiarizado com Python e PyQt5, pode apenas consultar o código abaixo e pular a explicação.

#!/ usr / bin / env python3
import sys
de PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QHBoxLayout
de PyQt5.QtWidgets import QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
de PyQt5.QtGui import QKeySequence
de PyQt5 import Qt
classe Window (QWidget):
def __init __ (self):
super().__iniciar__()
auto.file_path = Nenhum
auto.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), self)
auto.open_new_file_shortcut.ativado.conectar (eu mesmo.open_new_file)
auto.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), self)
auto.save_current_file_shortcut.ativado.conectar (eu mesmo.save_current_file)
vbox = QVBoxLayout ()
text = "Arquivo sem título"
auto.title = QLabel (texto)
auto.título.setWordWrap (True)
auto.título.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (self.título)
auto.setLayout (vbox)
auto.scrollable_text_area = QTextEdit ()
vbox.addWidget (self.scrollable_text_area)
def open_new_file (self):
auto.file_path, filter_type = QFileDialog.getOpenFileName (self, "Abrir novo arquivo",
"", "Todos os arquivos (*)")
se eu.caminho de arquivo:
com aberto (self.file_path, "r") como f:
file_contents = f.leitura()
auto.título.setText (self.caminho de arquivo)
auto.scrollable_text_area.setText (file_contents)
senão:
auto.invalid_path_alert_message ()
def save_current_file (self):
se não for eu.caminho de arquivo:
new_file_path, filter_type = QFileDialog.getSaveFileName (self, "Salve este arquivo
como… "," "," Todos os arquivos (*) ")
if new_file_path:
auto.file_path = new_file_path
senão:
auto.invalid_path_alert_message ()
retorna falso
file_contents = self.scrollable_text_area.toPlainText ()
com aberto (self.file_path, "w") como f:
f.escrever (file_contents)
auto.título.setText (self.caminho de arquivo)
def closeEvent (self, event):
messageBox = QMessageBox ()
title = "Sair do aplicativo?"
mensagem = "AVISO !!\ n \ nSe você sair sem salvar, quaisquer alterações feitas no arquivo
será perdido.\ n \ nSalve o arquivo antes de sair?"
reply = messageBox.question (self, title, message, messageBox.Sim | caixa de mensagem.Não
caixa de mensagem.Cancelar, messageBox.Cancelar)
if reply == messageBox.Sim:
return_value = self.save_current_file ()
if return_value == False:
evento.ignorar()
elif reply == messageBox.Não:
evento.aceitar()
senão:
evento.ignorar()
def invalid_path_alert_message (self):
messageBox = QMessageBox ()
caixa de mensagem.setWindowTitle ("Arquivo inválido")
caixa de mensagem.setText ("O nome do arquivo ou caminho selecionado nãoéválido. Selecione um
arquivo válido.")
caixa de mensagem.exec ()
if __name__ == '__main__':
app = QApplication (sys.argv)
w = janela ()
C.showMaximized ()
sys.sair (app.exec_ ())

Explicação

A primeira parte do código importa apenas módulos que serão usados ​​em todo o exemplo:

import sys
de PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QHBoxLayout
de PyQt5.QtWidgets import QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
de PyQt5.QtGui import QKeySequence
de PyQt5 import Qt

Na próxima parte, uma nova classe chamada “Window” é criada que herda da classe “QWidget”. A classe QWidget fornece componentes gráficos comumente usados ​​em Qt. Usando "super" você pode garantir que o objeto Qt pai seja retornado.

classe Window (QWidget):
def __init __ (self):
super().__iniciar__()

Algumas variáveis ​​são definidas na próxima parte. O caminho do arquivo é definido como "Nenhum" por padrão e atalhos para abrir um arquivo usando e salvando um arquivo usando são definidos usando a classe QShortcut. Esses atalhos são então conectados aos seus respectivos métodos que são chamados sempre que um usuário pressiona as combinações de teclas definidas.

auto.file_path = Nenhum
auto.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), self)
auto.open_new_file_shortcut.ativado.conectar (eu mesmo.open_new_file)
auto.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), self)
auto.save_current_file_shortcut.ativado.conectar (eu mesmo.save_current_file)

Usando a classe QVBoxLayout, um novo layout é criado ao qual os widgets filhos serão adicionados. Um rótulo alinhado ao centro é definido para o nome do arquivo padrão usando a classe QLabel.

vbox = QVBoxLayout ()
text = "Arquivo sem título"
auto.title = QLabel (texto)
auto.título.setWordWrap (True)
auto.título.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (self.título)
auto.setLayout (vbox)

Em seguida, uma área de texto é adicionada ao layout usando um objeto QTextEdit. O widget QTextEdit oferece uma área editável e rolável para trabalhar. Este widget suporta copiar, colar, cortar, desfazer, refazer, selecionar tudo, etc. atalhos do teclado. Você também pode usar um menu de contexto do botão direito na área de texto.

auto.scrollable_text_area = QTextEdit ()
vbox.addWidget (self.scrollable_text_area)

O método “open_new_fie” é chamado quando um usuário conclui atalho de teclado. A classe QFileDialog apresenta uma caixa de diálogo de seleção de arquivo para o usuário. O caminho do arquivo é determinado depois que um usuário seleciona um arquivo no seletor. Se o caminho do arquivo for válido, o conteúdo de texto é lido do arquivo e definido para o widget QTextEdit. Isso torna o texto visível para o usuário, altera o título para o novo nome de arquivo e conclui o processo de abertura de um novo arquivo. Se, por algum motivo, o caminho do arquivo não puder ser determinado, uma caixa de alerta de "arquivo inválido" será exibida para o usuário.

def open_new_file (self):
auto.file_path, filter_type = QFileDialog.getOpenFileName (self, "Abrir novo arquivo", "",
"Todos os arquivos (*)")
se eu.caminho de arquivo:
com aberto (self.file_path, "r") como f:
file_contents = f.leitura()
auto.título.setText (self.caminho de arquivo)
auto.scrollable_text_area.setText (file_contents)
senão:
auto.invalid_path_alert_message ()

O método “save_current_file” é chamado sempre que um usuário conclui atalho de teclado. Em vez de recuperar um novo caminho de arquivo, QFileDialog agora pede ao usuário para fornecer um caminho. Se o caminho do arquivo for válido, os conteúdos visíveis no widget QTextEdit são gravados no caminho completo do arquivo, caso contrário, uma caixa de alerta de "arquivo inválido" é mostrada. O título do arquivo que está sendo editado também é alterado para o novo local fornecido pelo usuário.

def save_current_file (self):
se não for eu.caminho de arquivo:
new_file_path, filter_type = QFileDialog.getSaveFileName (self, "Salve este arquivo
como… "," "," Todos os arquivos (*) ")
if new_file_path:
auto.file_path = new_file_path
senão:
auto.invalid_path_alert_message ()
retorna falso
file_contents = self.scrollable_text_area.toPlainText ()
com aberto (self.file_path, "w") como f:
f.escrever (file_contents)
auto.título.setText (self.caminho de arquivo)

O método “closeEvent” faz parte da API de manipulação de eventos PyQt5. Este método é chamado sempre que um usuário tenta fechar uma janela usando o botão de cruz ou pressionando combinação de teclas. Ao disparar o evento de fechamento, o usuário vê uma caixa de diálogo com três opções: “Sim”, “Não” e “Cancelar”. O botão “Sim” salva o arquivo e fecha o aplicativo enquanto o botão “Não” fecha o arquivo sem salvar o conteúdo. O botão “Cancelar” fecha a caixa de diálogo e leva o usuário de volta ao aplicativo.

def closeEvent (self, event):
messageBox = QMessageBox ()
title = "Sair do aplicativo?"
mensagem = "AVISO !!\ n \ nSe você sair sem salvar, quaisquer alterações feitas no arquivo
estar perdido.\ n \ nSalve o arquivo antes de sair?"
reply = messageBox.question (self, title, message, messageBox.Sim | caixa de mensagem.Não
caixa de mensagem.Cancelar, messageBox.Cancelar)
if reply == messageBox.Sim:
return_value = self.save_current_file ()
if return_value == False:
evento.ignorar()
elif reply == messageBox.Não:
evento.aceitar()
senão:
evento.ignorar()

A caixa de alerta de “arquivo inválido” não tem sinos e assobios. Ele apenas transmite a mensagem de que o caminho do arquivo não pôde ser determinado.

def invalid_path_alert_message (self):
messageBox = QMessageBox ()
caixa de mensagem.setWindowTitle ("Arquivo inválido")
caixa de mensagem.setText ("O nome do arquivo ou caminho selecionado nãoéválido. Selecione um arquivo válido.")
caixa de mensagem.exec ()

Por último, o loop principal do aplicativo para manipulação de eventos e desenho de widgets é iniciado usando o botão “.método exec_ () ”.

if __name__ == '__main__':
app = QApplication (sys.argv)
w = janela ()
C.showMaximized ()
sys.sair (app.exec_ ())

Executando o aplicativo

Basta salvar o código completo em um arquivo de texto e definir a extensão do arquivo como “.py ”, marque o arquivo executável e execute-o para iniciar o aplicativo. Por exemplo, se o nome do arquivo for “simple_text_editor.py ”, você precisa executar os dois comandos a seguir:

$ chmod + x simple_text_editor.py
$ ./ simple_text_editor.py

Coisas que você pode fazer para melhorar o Código

O código explicado acima funciona bem para um editor de texto básico. No entanto, pode não ser útil para fins práticos, pois carece de muitos recursos comumente vistos em bons editores de texto. Você pode melhorar o código adicionando novos recursos como números de linha, realce de linha, realce de sintaxe, várias guias, salvamento de sessão, barra de ferramentas, menus suspensos, detecção de alteração de buffer, etc.

Conclusão

Este artigo se concentra principalmente em fornecer um ponto de partida para a criação de aplicativos PyQt. Se você encontrar erros no código ou quiser sugerir algo, o feedback é bem-vindo.

O botão do meio do mouse não funciona no Windows 10
O botão do meio do mouse ajuda você a percorrer longas páginas da web e telas com muitos dados. Se isso parar, você vai acabar usando o teclado para r...
Como alterar os botões esquerdo e direito do mouse no PC com Windows 10
É normal que todos os dispositivos de mouse de computador sejam ergonomicamente projetados para usuários destros. Mas existem dispositivos de mouse di...
Emular cliques do mouse passando o mouse usando o mouse sem cliques no Windows 10
Usar um mouse ou teclado na postura errada de uso excessivo pode resultar em muitos problemas de saúde, incluindo tensão, síndrome do túnel do carpo e...