Como escrever um editor de texto simples no PYQT5

Como escrever um editor de texto simples no PYQT5
Este artigo abordará um guia sobre a criação de um editor de texto simples em Python3 e Pyqt5. QT5 é um conjunto de bibliotecas de plataformas cruzadas escritas em C ++, usadas principalmente para criar aplicativos gráficos ricos. O PYQT5 fornece ligações python para a versão mais recente do QT5. Todas as amostras de código deste artigo são testadas com Python 3.8.2 e pyqt5 versão 5.14.1 no Ubuntu 20.04.

Instalando o 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 do Linux, procure o termo "pyqt5" ​​no gerenciador de pacotes e instale -o a partir daí. Como alternativa, você pode instalar o PYQT5 no PIP Package Manager usando o comando abaixo:

$ pip install pyqt5

Observe que em algumas distribuições, talvez você precise usar o comando pip3 para instalar corretamente o pyqt5.

Código completo

Estou postando código completo de antemão para que você possa entender melhor o contexto para trechos de código individuais explicados mais adiante no artigo. Se você estiver familiarizado com o Python e o PYQT5, basta consultar o código abaixo e pular a explicação.

#!/usr/bin/Env Python3
Importar sistemas
de pyqt5.Qtwidgets importar qwidget, qapplication, qvboxlayout, qhboxlayout
de pyqt5.Qtwidgets importar qtextedit, qlabel, qshortcut, qfiledialog, qmessagebox
de pyqt5.Qtgui importa qkeysequence
De pyqt5 importar qt
Janela da classe (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.Conecte -se (self.open_new_file)
auto.save_current_file_shortcut = qshortcut (qkeysequence ('ctrl+s'), self)
auto.save_current_file_shortcut.ativado.Conecte -se (self.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, filtro_type = qfiledialog.getOpenFilename (self, "aberto novo arquivo",
"", "Todos os arquivos (*)")
se eu.caminho de arquivo:
com aberto (self.file_path, "r") como f:
file_contents = f.ler()
auto.título.setText (self.caminho de arquivo)
auto.scrollable_text_area.setText (file_contents)
outro:
auto.invalid_path_alert_message ()
def Save_current_file (self):
se não eu.caminho de arquivo:
new_file_path, filtro_type = qfiledialog.getSaveFilename (self, "salve este arquivo
como ... "," "," todos os arquivos (*) ")
Se new_file_path:
auto.file_path = new_file_path
outro:
auto.invalid_path_alert_message ()
retorna falso
file_contents = self.scrollable_text_area.topLaintext ()
com aberto (self.file_path, "w") como f:
f.Write (File_Contents)
auto.título.setText (self.caminho de arquivo)
def closeEvent (self, evento):
MessageBox = QMessageBox ()
title = "Quit Application?"
mensagem = "Aviso !!\ n \ nus você desiste sem salvar, quaisquer alterações feitas no arquivo
será perdido.\ n \ nsave Arquivo antes de parar?"
Responder = MessageBox.Pergunta (self, título, mensagem, caixa de mensagem.Sim | caixa de mensagem.Não |
caixa de mensagem.Cancelar, MessageBox.Cancelar)
Se responder == MessageBox.Sim:
return_value = self.save_current_file ()
se return_value == false:
evento.ignorar()
Elif Responder == MessageBox.Não:
evento.aceitar()
outro:
evento.ignorar()
def invalid_path_alert_message (self):
MessageBox = QMessageBox ()
caixa de mensagem.setWindowtitle ("arquivo inválido")
caixa de mensagem.setText ("nome do arquivo ou caminho selecionado não é válido. Selecione a
arquivo válido.")
caixa de mensagem.exec ()
se __name__ == '__main__':
app = qapplication (sys.argv)
w = janela ()
c.ShowMaximized ()
sys.saída (app.exec_ ())

Explicação

A primeira parte do código apenas importa módulos que serão usados ​​em toda a amostra:

Importar sistemas
de pyqt5.Qtwidgets importar qwidget, qapplication, qvboxlayout, qhboxlayout
de pyqt5.Qtwidgets importar qtextedit, qlabel, qshortcut, qfiledialog, qmessagebox
de pyqt5.Qtgui importa qkeysequence
De pyqt5 importar qt

Na próxima parte, é criada uma nova classe chamada "Window" que herda da classe "Qwidget". QWIdget Class fornece componentes gráficos comumente usados ​​no QT. Ao usar "super", você pode garantir que o objeto QT pai seja retornado.

Janela da classe (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 os atalhos para abrir um arquivo usando e salvar 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.Conecte -se (self.open_new_file)
auto.save_current_file_shortcut = qshortcut (qkeysequence ('ctrl+s'), self)
auto.save_current_file_shortcut.ativado.Conecte -se (self.save_current_file)

Usando a classe qvboxlayout, um novo layout é criado ao qual os widgets infantis serão adicionados. Uma etiqueta alinhada central está definida 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 fornecerá uma área editável e rolável para trabalhar. Este widget suporta cópia típica, colar, corte, desfazer, refazer, selecionar tudo etc. atalhos do teclado. Você também pode usar um menu de contexto de clique 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 completa o atalho do teclado. A classe Qfiledialog apresenta uma caixa de diálogo para seletor de arquivos para o usuário. O caminho do arquivo é determinado depois que um usuário seleciona um arquivo do seletor. Se o caminho do arquivo for válido, o conteúdo de texto será lido do arquivo e definido como Widget Qtextedit. Isso torna o texto visível ao usuário, altera o título para o novo nome do 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á mostrada ao usuário.

def open_new_file (self):
auto.file_path, filtro_type = qfiledialog.getOpenFilename (self, "aberto novo arquivo", "",
"Todos os arquivos (*)")
se eu.caminho de arquivo:
com aberto (self.file_path, "r") como f:
file_contents = f.ler()
auto.título.setText (self.caminho de arquivo)
auto.scrollable_text_area.setText (file_contents)
outro:
auto.invalid_path_alert_message ()

O método "Save_current_file" é chamado sempre que um usuário completa o atalho do teclado. Em vez de recuperar um novo caminho de arquivo, o Qfiledialog agora pede ao usuário que forneça um caminho. Se o caminho do arquivo for válido, o conteúdo visível no widget qtextedit será gravado no caminho completo do arquivo, caso contrário, uma caixa de alerta de "arquivo inválido" será mostrada. O título do arquivo atualmente editado também é alterado para o novo local fornecido pelo usuário.

def Save_current_file (self):
se não eu.caminho de arquivo:
new_file_path, filtro_type = qfiledialog.getSaveFilename (self, "salve este arquivo
como ... "," "," todos os arquivos (*) ")
Se new_file_path:
auto.file_path = new_file_path
outro:
auto.invalid_path_alert_message ()
retorna falso
file_contents = self.scrollable_text_area.topLaintext ()
com aberto (self.file_path, "w") como f:
f.Write (File_Contents)
auto.título.setText (self.caminho de arquivo)

O método "CloseEvent" faz parte da API de manuseio de eventos PYQT5. Este método é chamado sempre que um usuário tenta fechar uma janela usando o botão cruzado ou pressionando a combinação de teclas. Ao disparar o evento próximo, o usuário é mostrado 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, evento):
MessageBox = QMessageBox ()
title = "Quit Application?"
mensagem = "Aviso !!\ n \ nus você desiste sem salvar, quaisquer alterações feitas no arquivo irão
estar perdido.\ n \ nsave Arquivo antes de parar?"
Responder = MessageBox.Pergunta (self, título, mensagem, caixa de mensagem.Sim | caixa de mensagem.Não |
caixa de mensagem.Cancelar, MessageBox.Cancelar)
Se responder == MessageBox.Sim:
return_value = self.save_current_file ()
se return_value == false:
evento.ignorar()
Elif Responder == MessageBox.Não:
evento.aceitar()
outro:
evento.ignorar()

A caixa de alerta "arquivo inválido" não tem sinos e assobios. Apenas transmite a mensagem de que o caminho do arquivo não poderia ser determinado.

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

Por fim, o principal loop de aplicativos para manuseio de eventos e desenho de widgets é iniciado usando o “.método exec_ () ”.

se __name__ == '__main__':
app = qapplication (sys.argv)
w = janela ()
c.ShowMaximized ()
sys.saída (app.exec_ ())

Executando o aplicativo

Basta salvar o código completo em um arquivo de texto, defina 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 correr seguindo dois comandos:

$ chmod +x simples_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 nua. No entanto, pode não ser útil para fins práticos, pois não possui muitos recursos comumente vistos em bons editores de texto. Você pode melhorar o código adicionando novos recursos como números de linha, destaque da linha, destaque da sintaxe, várias guias, economia de sessão, barra de ferramentas, menus suspensos, detecção de alterações de buffer etc.

Conclusão

Este artigo se concentra principalmente em fornecer um terreno inicial para criar aplicativos PYQT. Se você encontrar erros no código ou deseja sugerir algo, o feedback é bem -vindo.